使用Python类型注释声明一个通用的Mapping子类?

时间:2017-02-01 07:51:49

标签: python generics annotations mypy

我正在尝试在Python 3.4中向Mapping子类添加泛型类型注释:

from typing import Mapping, TypeVar, Iterator, Dict

K = TypeVar('K')
V = TypeVar('V')


class M(Mapping[K, V]):
    def __init__(self) -> None:
        self.d = dict()     # type: Dict[K, V]

    def __getitem__(self, item: K) -> V:
        return self.d[item]

    def __len__(self) -> int:
        return len(self.d)

    def __iter__(self) -> Iterator[K]:
        return iter(self.d)


# Also errors, but less
# d = dict()  # type: Mapping[K, V]

我做错了什么,为什么mypy没有提供更有用的错误消息?

$ python -V; mypy -V
Python 3.4.3+
mypy 0.470

$ mypy map.py
map.py:7: error: Invalid type "map.K"
map.py:7: error: Invalid type "map.V"
map.py:9: error: Invalid type "map.K"
map.py:9: error: Invalid type "map.V"

1 个答案:

答案 0 :(得分:2)

好像你必须将Generic[K, V]添加为显式基类。

from typing import Mapping, TypeVar, Iterator, Dict, Generic

K = TypeVar('K')
V = TypeVar('V')


class M(Generic[K, V], Mapping[K, V]):
    def __init__(self) -> None:
        self.d = dict()     # type: Dict[K, V]

    def __getitem__(self, item: K) -> V:
        return self.d[item]

    def __len__(self) -> int:
        return len(self.d)

    def __iter__(self) -> Iterator[K]:
        return iter(self.d)

在您提出问题之前,mypy没有关键字Hashable约束的功能概念(从版本0.470开始)。 [1] [2]