Код: Выделить всё
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 V2 (2.9.2)
(Обратите внимание, что существует отдельная проблема, связанная с тем, что P является ковариантным и используется в качестве параметра метода, поэтому тип #: игнорировать)
Подробнее здесь: https://stackoverflow.com/questions/791 ... h-pydantic
Мобильная версия