Python 为什么每次迭代都要更新所有映射值?
我正在尝试创建一个方法,该方法可以接受任意数量的sqlalchemy模型,并确定它们是否具有相同的属性。该方法还接受Python 为什么每次迭代都要更新所有映射值?,python,python-3.x,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlalchemy,Flask Sqlalchemy,我正在尝试创建一个方法,该方法可以接受任意数量的sqlalchemy模型,并确定它们是否具有相同的属性。该方法还接受cols\u to\u ignore,这是一个表示要忽略的列名的字符串数组 为此,我使用模型的属性创建一个映射,并迭代每个模型,将每个列值添加到我存储为映射中的值的集合中。然后,映射被返回到另一个方法,该方法检查任何给定映射值的长度是否为1,这表示所有属性都相同,或者多个属性表示提交的模型具有不同的属性值 我遇到的问题是,代码当前更新每个键的值,而不仅仅是具有特定列名的键 例如,使
cols\u to\u ignore
,这是一个表示要忽略的列名的字符串数组
为此,我使用模型的属性创建一个映射,并迭代每个模型,将每个列值添加到我存储为映射中的值的集合中。然后,映射被返回到另一个方法,该方法检查任何给定映射值的长度是否为1,这表示所有属性都相同,或者多个属性表示提交的模型具有不同的属性值
我遇到的问题是,代码当前更新每个键的值,而不仅仅是具有特定列名的键
例如,使用以下模型运行代码(这里用json表示){birthMonth:'January',birthYear:1990},{birthMonth:'March',birthYear:1990}
应该会产生以下映射:
{'birthMonth':{一月、三月},'birthYear':{1990}
但结果却是:
{'birthMonth':{1990年1月,3月},出生年份:{1990年1月,3月}
这是我的密码:
def具有相同的属性(cols到ignore,*模型):
如果不是所有同一型号:
raise VALUERROR('模型类型必须全部匹配')
属性\映射=dict.fromkeys(模型[0]。\表\列.键(),集())
对于模型中的模型:
对于模型中的键。\u表\u.columns.keys():
如果输入cols\u以忽略:
持续
属性映射[key].add(getattr(model,key))
返回属性映射
对于属性_map.values()中的值:
如果(长度(值)>1):
返回错误
返回真值
all\u same\u model(models)
验证提交给该方法的所有模型是否属于同一类型
我觉得这很简单,我没有看到,但我已经做了一段时间,现在没有运气。感谢您的帮助。这是常见的
[[]]*10
错误的一个变体:dict.fromkeys
使用提供的单个对象作为每个键的值,因此只有一个集正在更新。(它如何知道如何重新创建一个“相似的”集合
对象?根据Davis Herring提供的答案,我能够重构代码,以避免使用dict.fromkeys方法并使其工作。这是现在可以使用的更新代码
def have_same_attributes(cols_to_ignore, *models):
if not all_same_model(models):
raise ValueError('Types of models must all match')
attribute_map = dict()
for key in models[0].__table__.columns.keys():
if key in cols_to_ignore:
continue
attribute_map[key] = set()
for model in models:
for key in model.__table__.columns.keys():
if key in cols_to_ignore:
continue
attribute_map[key].add(getattr(model, key))
if(len(attribute_map[key])>1):
return False
return True
return attribute\u map
似乎位于错误的位置,因为下面的循环从未执行过。