我有一个抽象类,它定义了一组方法并假设所有的孩子都有类变量集。
为了得到这个想法,这就是我尝试过的。
from typing import Type, TypeVar
T = TypeVar["T"]
class Parent(abc.ABC):
validator_cls: Type[T]
def process_data(self, data: dict[str, Any]) -> T:
entry = validator_cls(**data)
# do something
return entry
class ChildOne(Parent):
validator_cls = SomeValidator
def process_data(self, data):
entry = self.validator_cls(**data) # entry is not recognized as `SomeValidator`
return entry
不幸的是,虽然所有子类都附加了验证器类,但 mypy 不会在子类调用中继承该类(例如,它显示条目 var 为“Any”)。
我应该怎么做才能让mypy理解条目的类型?
首先,
TypeVar
是可赎回的,不可认购的。
T = TypeVar("T")
Generic
班。 T
变量不在范围内,引入它的最简单方法是在类级别使用 Generic
。
class Parent(Generic[T], abc.ABC):
...
现在您的孩子在下标中指定其类型。
class ChildOne(Parent[SomeValidator]):
validator_cls = SomeValidator
...
最后,由于
validator_cls
是一个类型,我们不能用 dict[str, Any]
类型的关键字参数构造它(毕竟,基本类型 object
没有参数)。在我看来,您希望 mypy 简单地接受 data
可能是正确的并且 not 对其进行类型检查。如果是这样,投到Any
.
entry = cast(Any, self.validator_cls)(**data)
cast
在typing
模块中,与Generic
、Any
和所有其他打字技巧一起。