python-3.x 复制没有继承的类dict变量

pdsfdshx  于 2023-01-03  发布在  Python
关注(0)|答案(2)|浏览(151)

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

juzqafwq1#

我相信你要找的是深度拷贝

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}}
798qvoo8

798qvoo82#

您会看到这种行为(类中更改的值在新的dict model中也会更改),因为您有一个嵌套的dict。cooldowns的值本身就是一个dict,但您的复制操作只应用于外部dict。内部dict不会被复制,实际上两者的dict是相同的。
如果您对dict使用deepcopy而不是其copy方法,这将确保内部dict不与类中的版本绑定。

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()

相关问题