这些奇特的TypeVar的PyCharm产生了什么?

时间:2017-07-02 21:35:14

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

我想实现一个通用字典,将文本键映射到正在或继承自MyConstrainingClass的类,所以我声明了TypeVarMyDict类,如下所示:

from typing import Mapping, TypeVar

T = TypeVar("T", MyConstrainingClass)


class MyDict(Mapping[str, T]):

当我接受PyCharm建议实现抽象基类方法时,它会生成以下输出:

class MyList(Mapping[str, T]):
    def __getitem__(self, k: _KT) -> _VT_co:
        pass

    def __iter__(self) -> Iterator[_T_co]:
        pass

    def __len__(self) -> int:
        pass

那些_KT_VT_co_T_co通用类型的变量是什么?我自己并没有在任何地方定义它们,它似乎是从超级班级中取出来的。

显然他们描述了“KeyType”,“ValueType covariant”和“Type(?)covariant”,但我不知道我是否必须在我的案例中创建这样的通用参数或者如何定义它们。

1 个答案:

答案 0 :(得分:1)

PyCharm从Mapping declaration in the typing module(或他们自己的内部版本的文件)中取出它们:

class Mapping(Collection[KT], Generic[KT, VT_co],
              extra=collections_abc.Mapping):
    __slots__ = ()

(从T_co)继承基类的Iterable协变量。

我会用更具体的版本替换这些建议:

class MyList(Mapping[str, T]):
    def __getitem__(self, k: str) -> T:
        pass

    def __iter__(self) -> Iterator[str]:
        pass

    def __len__(self) -> int:
        pass