不继承地复制类字典变量



我有一个简单的类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)

我相信你要找的是deepcopy

from copy import deepcopy

class User:
class Meta:
default_model = {
"cooldowns": {
"bonus": 0,
"transfer": 0,
}
}

print(User.Meta.default_model)
new = deepcopy(User.Meta.default_model)
new["cooldowns"]["bonus"] = 5
print(new)  # bonus now 5
print(User.Meta.default_model)  # bonus still 0

输出:

{'cooldowns': {'bonus': 0, 'transfer': 0}}
{'cooldowns': {'bonus': 5, 'transfer': 0}}
{'cooldowns': {'bonus': 0, 'transfer': 0}}

您会看到这种行为(在类中更改的值也会在新字典model中更改),因为您有一个嵌套字典。cooldowns的值本身就是一个字典,但是您的复制操作仅适用于该外部字典。内部字典不被复制,并且实际上是相同的字典。

如果在字典上使用deepcopy而不是它的copy方法,这将确保内部字典不绑定到类中的版本。

from copy import deepcopy
model = {**deepcopy(MainClass.InnerClass.default_model), 'user_id': 1}

否则,可以将复制操作添加到for循环中。但是,这需要您考虑default_model中是否有其他类型可能需要单独复制。例如,下面的代码不会对嵌套列表进行深度复制。如果可能的话,deepcopy是更好的处理方法。

model = {"user_id": 1}
for k, v in cls.Meta.default_model.items():
if k not in model:
model[k] = v if not isinstance(v, dict) else v.copy()

相关内容

  • 没有找到相关文章

最新更新