我知道,如果可变对象被放置在缺省值中,那么Pydtic会为我们创建的"every new instances"创建可变对象的深度副本.
它适用于我的lst
字段,但不适用于我的自定义对象item
.(__deepcopy__
的代码取自here)
from copy import deepcopy
from typing import Self
from pydantic import BaseModel, ConfigDict
class Spam:
def __init__(self) -> None:
self.names = ["hi"]
def __deepcopy__(self, memo: dict) -> Self:
print("deepcopy called")
cls = self.__class__
result = cls.__new__(cls)
memo[id(self)] = result
for k, v in self.__dict__.items():
setattr(result, k, deepcopy(v, memo))
return result
class Person(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
item: Spam = Spam()
lst: list = []
print("-----------------------------------")
obj1 = Person()
obj2 = Person()
obj1.lst.append(10)
obj1.item.names.append("bye")
print(obj1.lst)
print(obj1.item.names)
print(obj2.lst)
print(obj2.item.names)
print(id(obj1.item) == id(obj2.item))
输出:
deepcopy called
-----------------------------------
[10]
['hi', 'bye']
[]
['hi', 'bye']
True
我在创建类之后和任何实例化之前打印了虚线,只是为了表明我的对象的深度副本确实发生在类创建过程中,这与documentation:
在创建模型的每个实例时,PYDANIC将深度复制默认值
我是不是错过了什么?