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

tin*_*led 3 python inheritance type-hinting python-3.x mypy

我创建了一个类似字典的自定义类来简化跨大型数据集的评估指标的合并。此类实现了一种__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
Run Code Online (Sandbox Code Playgroud)

程序的最后一行中断了 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)

Mis*_*agi 6

self人们可以通过使用类型变量来引用“的类型”。这将解析为调用该方法的基类或子类的适当类型:

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
Run Code Online (Sandbox Code Playgroud)