从映射派生的类的类型推断

时间:2019-10-09 20:30:26

标签: python-3.x pycharm type-hinting

我有一个实现MutableMapping的类

V = TypeVar('V')
K = TypeVar('K')
class MM(MutableMapping[K, V]):
    def __getitem__(self, k):
        return 1

    def __setitem__(self, k, v):
        pass

    def __delitem__(self, k):
        pass

    def __iter__(self):
        return iter(())

    def __len__(self):
        return 0

这样使用:

test: MM[str, int] = MM()
test["a"] = 1
var = test["a"]

变量var应该是int类型(根据类型提示),但是pycharm告诉我不能推断其类型。

example

这是pycharm中的错误还是我做错了什么?

另一令人惊讶的是,当我将类定义更改为

MM(MutableMapping[str, V])

Pycharm表示var的类型是字符串。我想念什么?

1 个答案:

答案 0 :(得分:1)

您可能需要为每个方法添加类型提示。例如:

from typing import MutableMapping, TypeVar, Iterator

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

class MM(MutableMapping[K, V]):
    def __getitem__(self, k: K) -> V:
        return ???

    def __setitem__(self, k: K, v: V) -> None:
        pass

    def __delitem__(self, k: K) -> None:
        pass

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

    def __len__(self) -> int:
        return 0

虽然我不是100%Pycharm的推理引擎如何工作,但对我来说似乎很合理,如果您不对函数进行类型化,则默认情况是假设您打算对函数进行动态类型化,并且params /返回值的类型为“任何”。