从 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'.
类型
我有一个 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'.
类型