153

从模块中使用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)

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

4

2 回答 2

197

在 Python 3.9添加对使用标准集合的类型提示的支持之前,您必须使用typing.Tuple并且typing.List如果您想记录容器的内容需要是什么类型:

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

直到 Python 3.8,tuplelist支持用作泛型类型。上面的示例记录了该函数f要求points参数是具有两个float值的元组。

typing.Tuple这里的特殊之处在于它允许您指定特定数量的预期元素和每个位置的类型。如果未设置长度且类型应重复,则使用省略号:用sTuple[float, ...]描述可变长度。tuplefloat

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

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

如果您正在实现自定义容器类型并希望该类型支持泛型,您可以实现__class_getitem__挂钩或继承自typing.Generic(进而实现__class_getitem__)。

于 2016-09-12T20:22:17.487 回答
103

从 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.Tuple其他泛型typing.List已被弃用,并将在更高版本的 Python 中删除。

不推荐从其中导入这些typing内容。由于PEP 563和尽量减少键入的运行时影响的意图,此弃用不会生成 DeprecationWarnings。相反,当被检查程序的目标版本被通知为 Python 3.9 或更高版本时,类型检查器可能会警告这种不推荐使用的用法。建议允许在整个项目范围内消除这些警告。

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

于 2020-05-26T23:48:58.057 回答