这些花哨的 TypeVar 的 PyCharm 会生成啥?

Posted

技术标签:

【中文标题】这些花哨的 TypeVar 的 PyCharm 会生成啥?【英文标题】:What are these fancy TypeVar's PyCharm generates?这些花哨的 TypeVar 的 PyCharm 会生成什么? 【发布时间】:2017-12-06 02:58:11 【问题描述】:

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

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

【问题讨论】:

【参考方案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

【讨论】:

谢谢,这对我来说更有意义。我担心我必须创建一些协变 TypeVars 以满足 typing 模块的定义。

以上是关于这些花哨的 TypeVar 的 PyCharm 会生成啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeVar 在 MyPy 中使用参数键入装饰器会产生预期的无人居住类型

《绝地求生》新装备花哨无比!数据挖掘泄露未公开内容

TypeVar('T', A, B) 和 TypeVar('T', bound=Union[A, B]) 的区别

Python 类型提示:Callable 后跟 TypeVar 是啥意思?

Python 输入 TypeVar(A, B, covariant=True) 是啥意思?

Matrix 的 Python Generic 类,我收到无法实例化打字。TypeVar 错误