Python类型注释:返回继承方法的类型



我创建了一个类似字典的自定义类,以简化在大型数据集中合并评估指标。这个类实现了一个__add__方法来汇总各种度量。

以下是我正在处理的代码的简化版本:

from __future__ import annotations
from typing import TypeVar, Dict

T = TypeVar('T', int, float)

class AddableDict(Dict[str, T]):
def __add__(self, other: AddableDict[T]) -> AddableDict[T]:
if not isinstance(other, self.__class__):
raise ValueError()
new_dict = self.__class__()
all_keys = set(list(self.keys()) + list(other.keys()))
for key in all_keys:
new_dict[key] = self.get(key, 0) + other.get(key, 0)
return new_dict

# AddableIntDict = AddableDict[int]
# this would work just fine, however I need to add a few additional methods

class AddableIntDict(AddableDict[int]):
def some_int_specific_method(self) -> None:
pass

def main() -> None:
x = AddableIntDict()
y = AddableIntDict()
x['a'] = 1
y['a'] = 3
x += y  # breaks mypy

程序的最后一行破坏了mypy(0.782(,并出现以下错误:

error: Incompatible types in assignment (expression has type "AddableDict[int]", variable has type "AddableIntDict")

这个错误对我来说很有意义。

正如我在评论中所指出的,当我将AddableIntDict定义为AddableDict[int]的类型别名时,代码运行良好,但由于我需要根据字典值的类型添加其他方法,如some_int_specific_method所示,所以我不能简单地使用类型别名。

有人能为我指明正确的方向吗?如何注释父类的__add__方法,使其返回调用类的类型?

(我使用的是Python 3.8.3(

可以参考"CCD_ 7"的类型;通过使用类型变量。这解析为调用该方法的基类或子类的适当类型:

from typing import TypeVar, Dict

T = TypeVar('T', int, float)
AD = TypeVar('AD', bound='AddableDict')

class AddableDict(Dict[str, T]):
def __add__(self: AD, other: AD) -> AD: ...

class AddableIntDict(AddableDict[int]):
def some_int_specific_method(self) -> None: ...
x = AddableIntDict(a=1)
y = AddableIntDict(a=3)
x += y  # works for mypy and others

相关内容

最新更新