mypy:如何定义绑定到类变量的方法类型

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

我有一个抽象类,它定义了一组方法并假设所有的孩子都有类变量集。

为了得到这个想法,这就是我尝试过的。


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理解条目的类型?

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

首先,

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
和所有其他打字技巧一起。

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