TypeError: unhashable type: 'dict', when writing inline for loop output to JSON file
TypeError: unhashable type: 'dict', when writing inline for loop output to JSON file
我正在尝试制作一个程序,根据用户的输入生成 JSON 文件。
然后 JSON 文件将用于创建 python 文件,并使用 JSON 文件(此处未显示)生成 class。
提交输入后,您可以选择是否要在 JSON 对象中创建新实例。当您提交 'Y/y' 时,您可以创建一个新实例。之后,如果您提交 'N/n',我会收到错误。
import json
class GenerateSchema:
rounds = 0
# This list stores
instances = []
while True:
if len(instances) == 0:
schema_filename = input("*.json filename: ")
class_name = input("ClassName: ")
instance_name = input("First instance name: ")
instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
instance_description = input("Instance description (OPTIONAL): ")
keep_generating = input("Generate another instance? [Y/N]: ")
if keep_generating == "Y" or keep_generating == "y":
# Appends user inputs to 'instances' list
instances.append([instance_name, instance_params, instance_description])
rounds += 1
else:
break
def generate_schema(self):
with open(self.schema_filename + ".json", "w") as schema_file:
# Writes the JSON object to the JSON file. This line gives me the error.
schema_file.write(json.dumps(self.return_schema()))
schema_file.close()
def return_schema(self):
# Returns a JSON object based on user inputs
return {
{
"class": {
"name": self.class_name,
"instance": {
"name": instance[0],
"parameters": "self" + instance[1],
"description": instance[2]
}
}
} for instance in self.instances
}
schema_gen = GenerateSchema()
schema_gen.generate_schema()
如果你不明白我的代码,请告诉我。希望并感谢任何帮助或建议。 (我已经看过同样错误的其他问题,但他们没有给我解决方案)。
谢谢。
您的方法 return_schema 必须 return 值列表才能将其转储到 JSON。
def return_schema(self):
# Returns a JSON object based on user inputs
return [
{
"class": {
"name": self.class_name,
"instance": {
"name": instance[0],
"parameters": "self" + instance[1],
"description": instance[2]
}
}
} for instance in self.instances
]
我解决了这个问题,方法是遍历 instances
列表并根据实例名称创建一个新的嵌套字典。如果两次输入相同的实例名称,则第二次输入会覆盖第一次(我仍然需要要求具有不同的实例名称)
生成的 JSON 实例超过 1 个(取决于您提交的实例数量)。我所做的是使用 for loop
为每个实例创建一个新的嵌套字典。代码如下:
import json
class GenerateSchema:
rounds = 0
instances = []
while True:
if len(instances) == 0:
schema_filename = input("*.json filename: ")
class_name = input("ClassName: ")
instance_name = input("Instance name: ")
instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
instance_description = input("Instance description (OPTIONAL): ")
keep_generating = input("Generate another instance? [Y/N]: ")
if keep_generating == "Y" or keep_generating == "y":
instances.append([instance_name, instance_params, instance_description])
rounds += 1
elif keep_generating == "N" or keep_generating == "n":
instances.append([instance_name, instance_params, instance_description])
break
else:
print("[Y/N] please: ")
def generate_schema(self):
make_file = open(self.schema_filename + ".json", "w")
make_file.write('{}')
make_file.close()
with open(self.schema_filename + ".json", "r+") as f:
data = json.load(f)
data[self.class_name] = {
"name": self.class_name,
}
if not self.instance_params:
for instance in self.instances:
data[self.class_name][instance[0]] = {
"name": instance[0],
"parameters": "self",
"description": instance[2]
}
else:
for instance in self.instances:
data[self.class_name][instance[0]] = {
"name": instance[0],
"parameters": "self, " + instance[1],
"description": instance[2]
}
f.seek(0)
json.dump(data, f)
f.truncate()
Thank-you 你的帮助。
我正在尝试制作一个程序,根据用户的输入生成 JSON 文件。
然后 JSON 文件将用于创建 python 文件,并使用 JSON 文件(此处未显示)生成 class。
提交输入后,您可以选择是否要在 JSON 对象中创建新实例。当您提交 'Y/y' 时,您可以创建一个新实例。之后,如果您提交 'N/n',我会收到错误。
import json
class GenerateSchema:
rounds = 0
# This list stores
instances = []
while True:
if len(instances) == 0:
schema_filename = input("*.json filename: ")
class_name = input("ClassName: ")
instance_name = input("First instance name: ")
instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
instance_description = input("Instance description (OPTIONAL): ")
keep_generating = input("Generate another instance? [Y/N]: ")
if keep_generating == "Y" or keep_generating == "y":
# Appends user inputs to 'instances' list
instances.append([instance_name, instance_params, instance_description])
rounds += 1
else:
break
def generate_schema(self):
with open(self.schema_filename + ".json", "w") as schema_file:
# Writes the JSON object to the JSON file. This line gives me the error.
schema_file.write(json.dumps(self.return_schema()))
schema_file.close()
def return_schema(self):
# Returns a JSON object based on user inputs
return {
{
"class": {
"name": self.class_name,
"instance": {
"name": instance[0],
"parameters": "self" + instance[1],
"description": instance[2]
}
}
} for instance in self.instances
}
schema_gen = GenerateSchema()
schema_gen.generate_schema()
如果你不明白我的代码,请告诉我。希望并感谢任何帮助或建议。 (我已经看过同样错误的其他问题,但他们没有给我解决方案)。
谢谢。
您的方法 return_schema 必须 return 值列表才能将其转储到 JSON。
def return_schema(self):
# Returns a JSON object based on user inputs
return [
{
"class": {
"name": self.class_name,
"instance": {
"name": instance[0],
"parameters": "self" + instance[1],
"description": instance[2]
}
}
} for instance in self.instances
]
我解决了这个问题,方法是遍历 instances
列表并根据实例名称创建一个新的嵌套字典。如果两次输入相同的实例名称,则第二次输入会覆盖第一次(我仍然需要要求具有不同的实例名称)
生成的 JSON 实例超过 1 个(取决于您提交的实例数量)。我所做的是使用 for loop
为每个实例创建一个新的嵌套字典。代码如下:
import json
class GenerateSchema:
rounds = 0
instances = []
while True:
if len(instances) == 0:
schema_filename = input("*.json filename: ")
class_name = input("ClassName: ")
instance_name = input("Instance name: ")
instance_params = input("Instance parameter(s) ENTER for 'self' only: ")
instance_description = input("Instance description (OPTIONAL): ")
keep_generating = input("Generate another instance? [Y/N]: ")
if keep_generating == "Y" or keep_generating == "y":
instances.append([instance_name, instance_params, instance_description])
rounds += 1
elif keep_generating == "N" or keep_generating == "n":
instances.append([instance_name, instance_params, instance_description])
break
else:
print("[Y/N] please: ")
def generate_schema(self):
make_file = open(self.schema_filename + ".json", "w")
make_file.write('{}')
make_file.close()
with open(self.schema_filename + ".json", "r+") as f:
data = json.load(f)
data[self.class_name] = {
"name": self.class_name,
}
if not self.instance_params:
for instance in self.instances:
data[self.class_name][instance[0]] = {
"name": instance[0],
"parameters": "self",
"description": instance[2]
}
else:
for instance in self.instances:
data[self.class_name][instance[0]] = {
"name": instance[0],
"parameters": "self, " + instance[1],
"description": instance[2]
}
f.seek(0)
json.dump(data, f)
f.truncate()
Thank-you 你的帮助。