python - *.pyi 文件中的代码 '_T = TypeVar('_T')' 是什么意思?
问题描述
我是 Python 注释的新手(类型提示)。我注意到pyi
文件中的许多类定义继承到Generic[_T]
, 和_T = TypeVar('_T')
.
我一头雾水,这是什么_T
意思?</p>
from typing import Generic, TypeVar
_T = TypeVar('_T')
class Base(Generic[_T]): pass
解决方案
我建议通读整个内置类型模块文档。
打字.TypeVar
基本用法
具体来说,typing.TypeVar用于指定允许多种可能的类型。如果未指定特定类型,则任何类型都有效。
from typing import TypeVar
T = TypeVar('T') # <-- 'T' can be any type
A = TypeVar('A', str, int) # <-- 'A' will be either str or int
但是,如果T可以是任何类型,那么为什么要创建一个像这样的typing.TypeVar,而您可以只使用typing.Any作为类型提示呢?
原因是您可以确保特定的输入和输出参数具有相同的类型,如下例所示。
一个字典查找示例
from typing import TypeVar, Dict
Key = TypeVar('Key')
Value = TypeVar('Value')
def lookup(input_dict: Dict[Key, Value], key_to_lookup: Key) -> Value:
return input_dict[key_to_loopup]
起初这似乎是一个微不足道的例子,但这些注释要求输入字典中键的类型与key_to_lookup
参数相同,并且输出的类型也与字典中值的类型相匹配。
键和值作为一个整体可以是不同的类型,并且对于对该函数的任何特定调用,它们可能是不同的(因为键和值不限制类型),但是对于给定的调用,字典的键必须匹配查找键的类型,值和返回类型相同。
加法示例
如果您创建一个新的 TypeVar 并将类型限制为 float 和 int:
B = TypeVar('B', float, int)
def add_x_and_y(x: B, y: B) -> B:
return x + y
该函数要求 x 和 y 要么都是 float,要么都是 int,并且必须返回相同的类型。如果 x 是 float 而 y 是 int,则类型检查应该失败。
打字.通用
我对这个有点粗略,但是打字。通用(链接到官方文档)抽象基类(ABC)允许设置一个具有定义类型提示的类。他们在链接的文档中有一个很好的例子。
在这种情况下,他们正在创建一个完全通用的类型类。如果我理解正确,这允许Base[AnyName]
在代码的其他地方用作类型提示,然后可以重用AnyName
以在同一定义中的其他地方表示相同的类型(即在同一代码范围内)。
我想这对于避免TypeVar
重复使用很有用,您基本上可以通过仅使用 Base 类作为类型提示来随意创建新的 TypeVars,只要您只需要它用于该本地定义的范围即可。
推荐阅读
- sublimetext3 - 如何在 Sublime Text 3 中为特定语法设置保存文件的默认文件扩展名
- java - 在 intellj gradle 中创建一个空项目并添加 Micronaut 项目的新模块不起作用
- r - 对所有列进行变异并计算两个日期之间的差异
- amazon-web-services - 在 terraform 中授予 aws ec2 实例对 aws secretsmanager 的访问权限
- sqlite - 在 SQLite 表中强制执行顺序 rowid
- azure - 使用 Pulumi 将卷和文件添加到 Azure 中的容器
- python - 这个程序不工作,它说 MultiDegreeView 对象没有属性值,但我想使用字典的 values() 函数
- python - shebang 是否会覆盖 python 解释器路径
- python - 使用Python ffmpeg将音频文件和所有帧图片加入视频格式
- python - 产生迭代器的部分时如何检查相等性?