pyi文件中的代码“ _T = TypeVar('_ T')”是什么意思?

时间:2019-08-19 07:07:22

标签: python annotations pyi

我是Python注释的新手。我注意到pyi文件中的许多类定义都继承了“ Generic [_T]”和“ _T = TypeVar('_ T')”,所以我很困惑,_T在这里是什么意思?


from typing import Generic, TypeVar

_T = TypeVar('_T')

class Base(Generic[_T]): pass

1 个答案:

答案 0 :(得分:1)

我建议通读整个built-in typing module documentation


typing.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是浮点数,而y是整数,则类型检查应该失败。


typing.Generic

我对此略有粗略,但是typing.Generic(指向官方文档的链接)抽象基类(ABC)允许设置一个具有定义的类型提示的类。他们在链接的文档中有一个很好的例子。

在这种情况下,他们正在创建一个完全通用的类型类。如果我正确理解,则可以使用Base[AnyName]作为代码提示中的类型提示,然后可以重用AnyName来表示同一定义中其他位置的相同类型。

我认为这对于避免重复使用TypeVar很有用,只要您仅需要将Base类用作类型提示,就可以基本上随意创建新的TypeVars。本地定义。