使用List、Tuple等与输入模块有什么区别:

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添加使用标准集合的类型提示支持之前,您必须使用类型。元组和类型。如果你想记录容器的内容需要是什么类型,列出:

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

在Python 3.8之前,tuple和list都不支持作为泛型类型使用。上面的例子说明了函数f要求points参数是一个有两个浮点值的元组。

打字。Tuple在这里是特殊的,因为它允许您指定期望的特定数量的元素和每个位置的类型。如果没有设置长度并且类型需要重复,则使用省略号:描述一个带浮动的可变长元组。

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

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

如果你正在实现一个自定义容器类型,并希望该类型支持泛型,你可以实现__class_getitem__钩子或从typing继承。泛型(进而实现__class_getitem__)。

其他回答

从Python 3.9 (PEP 585)开始,tuple、list和各种其他类现在都是泛型类型。现在更喜欢使用这些而不是它们的类型对应物。从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)

你应该尽可能选择非类型泛型作为旧类型。元组,打字。List和其他泛型已弃用,并将在Python的后续版本中删除。

Importing those from typing is deprecated. Due to PEP 563 and the intention to minimize the runtime impact of typing, this deprecation will not generate DeprecationWarnings. Instead, type checkers may warn about such deprecated usage when the target version of the checked program is signalled to be Python 3.9 or newer. It's recommended to allow for those warnings to be silenced on a project-wide basis. The deprecated functionality will be removed from the typing module in the first Python version released 5 years after the release of Python 3.9.0.

在Python 3.9添加使用标准集合的类型提示支持之前,您必须使用类型。元组和类型。如果你想记录容器的内容需要是什么类型,列出:

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

在Python 3.8之前,tuple和list都不支持作为泛型类型使用。上面的例子说明了函数f要求points参数是一个有两个浮点值的元组。

打字。Tuple在这里是特殊的,因为它允许您指定期望的特定数量的元素和每个位置的类型。如果没有设置长度并且类型需要重复,则使用省略号:描述一个带浮动的可变长元组。

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

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

如果你正在实现一个自定义容器类型,并希望该类型支持泛型,你可以实现__class_getitem__钩子或从typing继承。泛型(进而实现__class_getitem__)。