如何创建与 Pydantic 兼容的托管属性?

问题描述 投票:0回答:1

我有一个模型,每当设置值时我都需要做一些工作。通常我会使用托管属性。但是,我想在新值设置静止时验证它(使用 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

python python-typing pydantic
1个回答
0
投票

您使用类型

_parent
声明了
weakref.ref[Any]
。它需要改为
weakref.ref[P]

class ManagedNode(BaseModel, Generic[P]):
    _parent: Optional[weakref.ref[P]] = None

    ...
© www.soinside.com 2019 - 2024. All rights reserved.