了解 TypeVar 的用法

sam*_*249 7 python

当谈到 时Generics,python 给出了以下示例:

from collections.abc import Sequence
from typing import TypeVar

T = TypeVar('T')      # Declare type variable

def first(l: Sequence[T]) -> T:   # Generic function
    return l[0]
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下TypeVar这种情况下的作用吗?例如,如果它可以是任何东西,为什么不直接赋予它值呢Any?如果它受到限制,为什么不给它一个Union值呢?换句话说,使用有什么用处TypeVar(...)

我想在回顾上面的内容时,它是在某种子元素的元素时使用的?例如,它可以是:

[{set1}, {set2}, {set3}, ...]
Run Code Online (Sandbox Code Playgroud)

那种类型是Sequence[set] -> set

但像这样的事情:

[1, 2, 3, ...]
Run Code Online (Sandbox Code Playgroud)

会有类型Sequence[int] -> int。除了这个“item-in-iterable”之外还有其他用法吗?

Sam*_*ord 7

在此上下文中的目的TypeVar是说该函数返回与参数类型相关的特定类型。

例如,如果您这样做:

a = first([1, 2, 3]) + "foo"
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误,因为在这个表达式中T绑定到类型int,所以你会得到一个关于添加 anint和 a 的错误str

如果您按照您的描述使用类型进行注释firstAny则不会产生 mypy 错误(因此您会TypeError在运行时得到 a ),因为 的返回值first始终只是Any

有关如何使用类型变量的更多示例,请参阅有关泛型的 mypy 文档:https://mypy.readthedocs.io/en/stable/generics.html

  • 是的,类型变量在很多地方都很有用。任何时候你需要在类型注释中表达两个事物的类型之间的关系(即你不知道这两种类型具体是什么,但你知道它们以某种方式相关),你可能想要使用 typevar。 (2认同)