如何解决带有实例变量的pydantic BaseModel
我正在使用带有 fastapi 的 pydantic。 而且,我制作了这样的模型。
# model.py
from multiprocessing import RLock
from pydantic import BaseModel
class ModelA(BaseModel):
file_1: str = 'test'
def __init__(self,**data: Any):
super().__init__(**data)
self._lock = RLock()
self._instance_variable: int = 1
@property
def lock(self):
return self._lock
@property
def instance_variable(self) -> int:
with self.lock:
return self._instance_variable
@instance_variable.setter
def instance_variable(self,v: int) -> int:
assert isinstance(v,int)
with self.lock:
self._instance_variable = v
我做这样的测试
# test_model_a.py
def test_model_a():
instance = ModelA()
assert instance.json() == '{"field_1": "test"}'
之后,我运行了测试,但由于此错误无法创建实例。
E ValueError: "ModelA" object has no field "_lock"
那么,我怎样才能通过这个测试......? 请……帮帮我……
解决方法
您需要使用 PrivateAttr
字段。而不是 setter,而是使用 __setattr__
from multiprocessing import RLock,synchronize
from typing import Any
from pydantic import BaseModel,PrivateAttr
class ModelA(BaseModel):
file_1: str = 'test'
_lock: synchronize.RLock = PrivateAttr()
_instance_variable: int = PrivateAttr()
def __init__(self,**data: Any):
super().__init__(**data)
self._lock = RLock()
self._instance_variable: int = 1
@property
def lock(self):
return self._lock
@property
def instance_variable(self) -> int:
with self.lock:
return self._instance_variable
def __setattr__(self,key,val):
if key == "instance_variable":
assert isinstance(val,int)
with self.lock:
self._instance_variable = val
return
super().__setattr__(key,val)
您还可以避免使用自定义 __init__
class ModelA(BaseModel):
file_1: str = 'test'
_lock: synchronize.RLock = PrivateAttr(default_factory=RLock)
_instance_variable: int = PrivateAttr(1)
# ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。