使用 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)
何时应该使用其中一个而不是另一个?
使用 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)
何时应该使用其中一个而不是另一个?
直到Python 3.9 增加了对标准集合进行类型提示的支持,如果你想记录容器的内容所需的类型,你必须使用typing.Tuple
和typing.List
:
def f(points: Tuple[float, float]):
return map(do_stuff, points)
在Python 3.8之前,tuple
和list
不支持作为通用类型使用。上面的示例说明了函数f
需要points
参数是一个包含两个float
值的元组。
typing.Tuple
在这里是特殊的,因为它允许您指定期望的元素数量和每个位置的类型。如果长度未设置并且要重复类型,请使用省略号:Tuple[float, ...]
描述具有float
的可变长度tuple
。
对于typing.List
和其他序列类型,通常仅为所有元素指定类型;List[str]
是一个任意大小的字符串列表。请注意,函数应优先采用typing.Sequence
作为参数,而typing.List
通常仅用于返回类型;一般来说,大多数函数将接受任何序列并仅进行迭代,但是当您返回一个list
时,您确实返回了一个特定的可变序列类型。
如果仍需要支持Python 3.8或更早版本的代码,则即使当前未限制内容,也应始终选择typing
通用类型。使用通用类型稍后添加约束更容易,因为生成的更改将更小。
如果您正在实现自定义容器类型并希望该类型支持泛型,则可以实现__class_getitem__
钩子或从typing.Generic
继承(它又实现了__class_getitem__
)。
from typing import Tuple
。 - Sparkofska__class_getitem__()
的标准库类,或者继承typing.Generic
,它有自己的__class_getitem__()
实现。” __class_getitem__
主要是为了解决元类的限制而实现的一个细节。 - Peilonrayz从Python 3.9(PEP 585)开始,tuple
、list
和其他各种类现在是泛型类型。现在更建议使用它们而不是它们的typing
对应项。从Python 3.9开始,您现在可以这样做:
def f(points: tuple[float, float]):
return map(do_stuff, points)
from __future__ import annotations
def f(points: tuple[float, float]):
return map(do_stuff, points)
typing
泛型,因为旧的typing.Tuple
、typing.List
和其他泛型已被弃用,并将在Python的后续版本中删除。typing
导入这些内容是不推荐的。由于PEP 563和最小化typing运行时影响的意图,此弃用不会生成DeprecationWarnings。相反,类型检查器可能会在检查的程序目标版本为Python 3.9或更高版本时警告有关此类弃用的使用。建议在项目范围内允许消除这些警告。typing
泛型是否有意义? - Mateen Ulhaq__future__.annotations
所做的操作(def f(points: "tuple[float, float]")
),但如果你需要在运行时评估类型提示,那么代码将无法正常工作。 - Peilonrayz[
和 ]
- 进行输入。如果尝试使用 tuple(float, float)
,将会出现 TypeError: tuple expected at most 1 argument, got 2
。 - codeananda[
和 ]
。如果您尝试使用 tuple(float, float)
,将会出现 TypeError: tuple expected at most 1 argument, got 2
的错误提示。 - undefined