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

Ray*_*Ray 2 python generics type-hinting python-3.x

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

from typing import Mapping, TypeVar

T = TypeVar("T", MyConstrainingClass)


class MyDict(Mapping[str, T]):
Run Code Online (Sandbox Code Playgroud)

当我接受 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
Run Code Online (Sandbox Code Playgroud)

_KT那些, _VT_co,泛型类型变量是什么_T_co?我自己没有在任何地方定义它们,它似乎是从超级类中获取它们的。

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

Mar*_*ers 5

PyCharm 从模块Mapping中的声明typing(或它们自己的文件内部版本)中获取它们:

class Mapping(Collection[KT], Generic[KT, VT_co],
              extra=collections_abc.Mapping):
    __slots__ = ()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)