我有一个简单的类,包含default_model,如下所示:
class User(BaseModel):
class Meta:
collection = db.client.users
default_model = {
'cooldowns': {
'bonus': 0,
'transfer': 0,
}
}
如何复制 meta.default_model而不将其链接到类本身?也就是说,命令将是一次性的,而不是从类本身继承的。我尝试了两次,但它们都绑定到类(
第一次尝试
model = {"user_id": 1}
for k, v in cls.Meta.default_model.items():
if k not in model:
model[k] = v
第二次尝试
model = {"user_id": 1} | cls.Meta.default_model.copy()
我的意思是:
class User:
class Meta:
default_model = {
"cooldowns": {
"bonous": 0
}
}
model = {}
for k, v in User.Meta.default_model.items():
model[k] = v
# It changes User.Meta.default_model
model['cooldowns']['bonous'] = 1
print(User.Meta.default_model)
2条答案
按热度按时间juzqafwq1#
我相信你要找的是深度拷贝
这将给出输出:
798qvoo82#
您会看到这种行为(类中更改的值在新的dict
model
中也会更改),因为您有一个嵌套的dict。cooldowns
的值本身就是一个dict,但您的复制操作只应用于外部dict。内部dict不会被复制,实际上两者的dict是相同的。如果您对dict使用deepcopy而不是其copy方法,这将确保内部dict不与类中的版本绑定。
否则,你可以将复制操作添加到你的for循环中。但是,这需要你考虑在
default_model
中是否有其他类型需要单独复制。例如,下面的代码不会对嵌套列表进行深度复制。如果可能,deepcopy是处理这个问题的更好方法。