使用列表/元组/等。从输入VS直接引用类型作为列表/元组/等

使用ListTuple等有什么区别?从typing模块:

from typing import Tuple


def f(points: Tuple):
return map(do_stuff, points)

而不是直接引用Python的类型:

def f(points: tuple):
return map(do_stuff, points)

什么时候我应该使用一个而不是另一个?

128498 次浏览

在Python3.9添加了对使用标准集合的类型提示的支持之前,如果您想要记录容器的内容所需的类型,则必须使用typing.Tupletyping.List

def f(points: Tuple[float, float]):
return map(do_stuff, points)

直到Python3.8,tuplelist都不支持用作泛型类型。以上示例记录了函数__abc2要求__abc3自变量是具有两个__abc4值的元组。

typing.Tuple在这里是特殊的,因为它允许您指定预期的元素的具体数量和每个位置的类型。如果未设置长度并且应重复类型,则使用省略号:Tuple[float, ...]描述具有floatS的可变长度tuple

对于typing.List和其他序列类型,通常只需指定所有元素的类型;List[str]是任意大小的字符串列表。注意,函数应优先采用typing.Sequence作为参数,而typing.List通常仅用于返回类型。一般来说,大多数函数都会接受任意序列并且只进行迭代,但是当您返回list时,您实际上是在返回特定的、可变的序列类型。

如果您仍然需要支持Python3.8或更早版本的代码,您应该始终选择typing泛型,即使您当前没有限制内容。稍后使用泛型类型更容易添加该约束,因为所产生的更改将更小。

如果要实现自定义容器类型并希望该类型支持泛型,则可以实现__class_getitem__挂钩或从typing.Generic继承(后者又实现__class_getitem__)。

从Python3.9(PEP 585)开始,tuplelist和各种其他类现在都是泛型类型。现在优选使用这些而不是它们的typing对应物。在Python 3.9中,您现在只需执行以下操作:

def f(points: tuple[float, float]):
return map(do_stuff, points)

由于PEP 563,如果您不需要计算类型提示,那么可以在Python3.7+中使用此语法。

from __future__ import annotations




def f(points: tuple[float, float]):
return map(do_stuff, points)

只要有可能,您应该始终选择非typing泛型,因为旧的typing.Tupletyping.List其他泛型已被弃用,并将在以后的Python版本中删除。

不推荐从typing中导入。由于PEP 563以及最小化类型对运行时的影响,此弃用将不会生成DeprecationWarnings.相反,当被检查程序的目标版本被标记为Python 3.9或更新版本时,类型检查器可能会警告这种不推荐的用法。建议允许在整个项目范围内消除这些警告。

在Python 3.9.0发布5年后发布的第一个Python版本中,将从类型模块中删除已弃用的功能。