使用List / Tuple / etc。从输入vs直接引用类型为list / tuple / etc.

时间:2016-09-12 20:20:00

标签: python python-3.5 typing type-hinting

List模块中使用Tupletyping等的区别是什么:

from typing import Tuple

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

与直接引用Python的类型相反:

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

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

2 个答案:

答案 0 :(得分:41)

typing.Tupletyping.ListGeneric 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)开始,tuplelist和其他各种类现在都是通用类型。现在首选使用这些而不是它们的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.Tupletyping.Listother generics,并将在更高版本的Python中将其删除

不建议导入typing中的内容。由于PEP 563的目的是最大程度地减少键入对运行时间的影响,因此此弃用将不会生成DeprecationWarnings。相反,当被检查程序的目标版本被信号通知为Python 3.9或更高版本时,类型检查器可能会警告此类已过时的用法。建议允许在整个项目范围内将这些警告静音。

在Python 3.9.0发行5年后的第一个Python版本中,过时的功能将从打字模块中删除。