【问题标题】:Pydantic cannot pickle private attributePydantic 不能腌制私有属性
【发布时间】:2022-06-26 16:02:15
【问题描述】:

我试图为我的模型设置一个私有属性(不能腌制):

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_allowedcopy_on_model_validation 无效。我也尝试使用PrivateAttr(default=Lock()),但没有帮助。

我想将此属性设为私有。如何将无法腌制的私有属性设置为 Pydantic 模型?

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    在进行更多调查后,我自己找到了答案。看来这可以使用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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2021-11-01
      相关资源
      最近更新 更多