首页 > 解决方案 > 了解 TypeVar 的用法

问题描述

在谈到 时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]

有人可以解释一下TypeVar在这种情况下做什么吗?例如,如果它可以是任何东西,为什么不给它 valueAny呢?如果它受到约束,为什么不给它一个Union值呢?换句话说, using 有什么用处TypeVar(...)

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

[{set1}, {set2}, {set3}, ...]

这种类型将是Sequence[set] -> set

但是这样的事情:

[1, 2, 3, ...]

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

标签: python

解决方案


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

例如,如果您这样做:

a = first([1, 2, 3]) + "foo"

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

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

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


推荐阅读