List
模块中使用Tuple
,typing
等的区别是什么:
from typing import Tuple
def f(points: Tuple):
return map(do_stuff, points)
与直接引用Python的类型相反:
def f(points: tuple):
return map(do_stuff, points)
我什么时候应该使用另一个?
答案 0 :(得分:41)
typing.Tuple
和typing.List
为Generic types;这意味着您可以指定其内容必须是哪种类型:
def f(points: Tuple[float, float]):
return map(do_stuff, points)
这指定传入的元组必须包含两个float
值。您无法使用内置的tuple
类型执行此操作。
typing.Tuple
在这里很特别,它允许您指定预期的特定数量的元素和每个位置的类型。如果未设置长度并且应重复类型,请使用省略号:Tuple[float, ...]
描述带有tuple
s的可变长度float
。
对于typing.List
和其他序列类型,通常只指定所有元素的类型; List[str]
是任意大小的字符串列表。请注意,函数应优先使用type.Sequence
作为参数,typing.List
通常仅用于返回类型;一般来说,大多数函数都会采用任何序列并且只进行迭代,但是当你返回list
时,你真的会返回一个特定的,可变的序列类型。
即使您目前没有限制内容,也应始终选择typing
泛型。稍后使用泛型类型添加该约束会更容易,因为生成的更改将更小。
答案 1 :(得分:30)
从Python 3.9(PEP 585)开始,tuple
,list
和其他各种类现在都是通用类型。现在首选使用这些而不是它们的typing
副本。从Python 3.9开始,您现在可以执行以下操作:
def f(points: tuple[float, float]):
return map(do_stuff, points)
如果您不需要评估类型提示,则可以基于PEP 563在Python 3.7+中使用此语法。
from __future__ import annotations
def f(points: tuple[float, float]):
return map(do_stuff, points)
您应该始终选择非通用的typing
,因为不推荐使用旧的typing.Tuple
,typing.List
和other generics,并将在更高版本的Python中将其删除
不建议导入
typing
中的内容。由于PEP 563的目的是最大程度地减少键入对运行时间的影响,因此此弃用将不会生成DeprecationWarnings。相反,当被检查程序的目标版本被信号通知为Python 3.9或更高版本时,类型检查器可能会警告此类已过时的用法。建议允许在整个项目范围内将这些警告静音。在Python 3.9.0发行5年后的第一个Python版本中,过时的功能将从打字模块中删除。