我是Python注释的新手。我注意到pyi文件中的许多类定义都继承了“ Generic [_T]”和“ _T = TypeVar('_ T')”,所以我很困惑,_T在这里是什么意思?
from typing import Generic, TypeVar
_T = TypeVar('_T')
class Base(Generic[_T]): pass
答案 0 :(得分:1)
我建议通读整个built-in typing module documentation。
具体地说,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是浮点数,而y是整数,则类型检查应该失败。
我对此略有粗略,但是typing.Generic(指向官方文档的链接)抽象基类(ABC)允许设置一个具有定义的类型提示的类。他们在链接的文档中有一个很好的例子。
在这种情况下,他们正在创建一个完全通用的类型类。如果我正确理解,则可以使用Base[AnyName]
作为代码提示中的类型提示,然后可以重用AnyName
来表示同一定义中其他位置的相同类型。
我认为这对于避免重复使用TypeVar
很有用,只要您仅需要将Base类用作类型提示,就可以基本上随意创建新的TypeVars。本地定义。