【问题标题】:Type inference for class derived from Mapping从 Mapping 派生的类的类型推断
【发布时间】:2023-03-14 03:40:02
【问题描述】:

我有一个实现 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 中的错误还是我做错了什么?

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

MM(MutableMapping[str, V])

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

【问题讨论】:

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


    【解决方案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/返回值的类型为“任何”。

    【讨论】:

    • 谢谢你说的完全正确。早该想到的
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多