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

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

我想实现一个通用字典,将文本键映射到 MyConstrainingClass 或继承自 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泛型类型变量是什么?我自己没有在任何地方定义它们,它似乎是从父类(super class)中获取它们的。

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

最佳答案

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

关于python - 这些奇特的 TypeVar 的 PyCharm 生成了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44875428/

相关文章:

python - 使用 numpy 获取切片后剩余的内容

python - Pickle functools 包装器错误 : can't pickle functools. KeyWrapper 对象

java - 为什么编译时没有任何未经检查的类型警告?

python - cython setup.py 给出 .o 而不是 .dll

python - 美汤缺失数据

python - 不支持的操作 :not writeable python

java - 编译带有边界的泛型时出错

java - 用非泛型实现覆盖泛型方法

python - 如何在 Python 中通过 HTTP 从 UDP 流提供数据?

python-3.x - 如何在 WSL2 上的 Ubuntu 中安装 cuDNN?