我有一个模型,每当设置值时我都需要做一些工作。通常我会使用托管属性。但是,我想在新值设置静止时验证它(使用 Pydantic)。我尝试过使用
@validate_call
,但它不会因错误输入而引发预期的 ValidationError
。下面是模拟代码。
from pydantic import BaseModel, validate_call
P = TypeVar("P", covariant=True)
class ManagedNode(BaseModel, Generic[P]):
_parent: Optional[weakref.ref] = None
@property
def parent(self) -> Optional[P]:
return self._parent() if self._parent is not None else None
@parent.setter
@validate_call
def parent(self, parent: P): # type: ignore
self._parent = weakref.ref(parent) if parent is not None else None
class A:
pass
class B:
pass
ManagedNode[A]().parent = B() # this does not raise a ValidationError
是否有更好的方法使用 Pydantic 来管理属性?
使用 Pydantic V2 (2.9.2)
(请注意,存在一个与
P
协变并用作方法参数相关的单独问题,因此 # type: ignore
)
您使用类型
_parent
声明了 weakref.ref[Any]
。它需要改为weakref.ref[P]
。
class ManagedNode(BaseModel, Generic[P]):
_parent: Optional[weakref.ref[P]] = None
...