从 Mapping 派生的 class 的类型推断

Type inference for class derived from Mapping

我有一个 class 实现 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告诉我它的类型无法推断。

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

另一件令人惊讶的事情是,当我将 class 定义更改为

MM(MutableMapping[str, V])

Pycharm表示var的类型是string。我错过了什么?

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

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/return 值是 'Any'.

类型