在Python中对元组进行类型提示

141

当我想在Python中为元组添加类型提示时,可以这样写:

def func(var: tuple[int, int]):
    # do something

func((1, 2))    # would be fine
func((1, 2, 3)) # would throw an error

需要在元组中准确给出项目数量。这与列表类型提示不同:

def func(var: list[int]):
    # do something

func([1])       # would be fine
func([1, 2])    # would also be fine
func([1, 2, 3]) # would also be fine

这在一定程度上是由于元组的类型。因为它们被设计成不可更改,所以您必须硬编码其中的项数。

那么我的问题是,有没有办法使元组类型提示中的项数具有灵活性?我尝试过类似这样的方法,但它并没有起作用:

因此,我的问题是,是否有一种方法可以使元组类型提示中的项数具有灵活性?我尝试了类似以下的代码,但它没有起作用:

def func(var: tuple[*int]):
2个回答

185

是的,你可以使元组类型提示中的项目数量具有灵活性:

from typing import Tuple

def func(var: Tuple[int, ...]):
    pass

来自文档: https://docs.python.org/zh-cn/3/library/typing.html#typing.Tuple

要指定一个同类型的可变长度元组,请使用省略号,例如 Tuple[int, ...]。普通的 Tuple 等效于 Tuple[Any, ...],进而等效于 tuple


1
我遇到了错误:“类”的“函数”的参数“对象”具有不兼容的类型“List [Tuple [Any]]”; 期望值为“List [Tuple [Any,...]]”。在我看来,“List [Tuple [Any]]”应该等于“List [Tuple [Any,...]]”,对吗?例如,list(tuple(object))== list(tuple(object,object))?我还在使用mypy。 - Lion Lai
不,你应该收到错误提示 "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance。考虑使用协变的 Sequence[tuple[Any]] 替代。 - aaron

64

PEP 585 开始,可以无需导入 typing 模块使用内置的类型提示。因此,从 Python 3.9 开始,Tuple[...] 已经被弃用,推荐使用 tuple[...]。例如:

def func(var: tuple[int, ...]):
    pass

这不是在Python 3.10中引入的吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接