我试图为我的模型设置一个私有属性(不能被腌制):
from threading import Lock
from pydantic import BaseModel
class MyModel(BaseModel):
class Config:
underscore_attrs_are_private = True
_lock: Lock = Lock() # This cannot be copied
x = MyModel()但这会产生一个错误:
Traceback (most recent call last):
File ".../example.py", line 9, in <module>
x = MyModel()
File "pydantic\main.py", line 349, in pydantic.main.BaseModel.__init__
File "pydantic\main.py", line 419, in pydantic.main.BaseModel._init_private_attributes
File "pydantic\fields.py", line 1180, in pydantic.fields.ModelPrivateAttr.get_default
File "pydantic\utils.py", line 657, in pydantic.utils.smart_deepcopy
File "...\lib\copy.py", line 161, in deepcopy
rv = reductor(4)
TypeError: cannot pickle '_thread.lock' object它似乎失败了,因为Lock不能被腌制(或复制)。此外,Pydantic似乎出于某种原因试图复制私有属性。我查看了文档,找不到一个模型属性来覆盖它。此外,arbitrary_types_allowed或copy_on_model_validation的信任也没有任何影响。我也尝试过使用PrivateAttr(default=Lock()),但这并没有帮助。
有趣的是,如果属性不是私有的(通过在underscore_attrs_are_private = False中设置Config),则该示例可以工作。
我想把这个属性作为私有属性。我如何设置不能被归纳为Pydantic模型的私有属性?
发布于 2022-06-26 08:02:15
经过进一步的调查,我自己找到了答案。这似乎可以用default_factory来解决
from threading import Lock
from pydantic import BaseModel, PrivateAttr
class MyModel(BaseModel):
class Config:
underscore_attrs_are_private = True
_lock = PrivateAttr(default_factory=Lock)
x = MyModel()而且,复制似乎只在BaseModel init中完成。还可以稍后设置该属性:
from threading import Lock
from pydantic import BaseModel, PrivateAttr
class MyModel(BaseModel):
class Config:
underscore_attrs_are_private = True
_lock: Lock
def __init__(self, **kwargs):
super().__init__(**kwargs)
self._lock = Lock()
x = MyModel()https://stackoverflow.com/questions/72759846
复制相似问题