首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pydantic不能提取私有属性

Pydantic不能提取私有属性
EN

Stack Overflow用户
提问于 2022-06-26 08:02:15
回答 1查看 440关注 0票数 2

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

代码语言:javascript
复制
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()

但这会产生一个错误:

代码语言:javascript
复制
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()),但这并没有帮助。

有趣的是,如果属性不是私有的(通过在underscore_attrs_are_private = False中设置Config),则该示例可以工作。

我想把这个属性作为私有属性。我如何设置不能被归纳为Pydantic模型的私有属性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-26 08:02:15

经过进一步的调查,我自己找到了答案。这似乎可以用default_factory来解决

代码语言:javascript
复制
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中完成。还可以稍后设置该属性:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72759846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档