这些花哨的 TypeVar 的 PyCharm 会生成啥?
Posted
技术标签:
【中文标题】这些花哨的 TypeVar 的 PyCharm 会生成啥?【英文标题】:What are these fancy TypeVar's PyCharm generates?这些花哨的 TypeVar 的 PyCharm 会生成什么? 【发布时间】:2017-12-06 02:58:11 【问题描述】:我想实现一个通用字典,将文本键映射到 MyConstrainingClass
或继承自 MyConstrainingClass
的类,因此我声明了 TypeVar
和 MyDict
类,如下所示:
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
【讨论】:
谢谢,这对我来说更有意义。我担心我必须创建一些协变TypeVar
s 以满足 typing
模块的定义。以上是关于这些花哨的 TypeVar 的 PyCharm 会生成啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 TypeVar 在 MyPy 中使用参数键入装饰器会产生预期的无人居住类型
TypeVar('T', A, B) 和 TypeVar('T', bound=Union[A, B]) 的区别
Python 类型提示:Callable 后跟 TypeVar 是啥意思?