类型提示一个元组而不是太冗长

Type-hinting a tuple without being too verbose

有没有一种方法可以键入提示元素的元组,而不必多次定义每个内部元素?

示例:

a = ((1, 2), (2, 3), (3, 4), (4, 5))

a: Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, int], Tuple[int, int]]

我正在寻找类似这样的东西

a: Tuple[5*Tuple[int, int]]

否则我的代码会变得非常冗长以指示类似的东西(包含 4 个整数的 5 个元组的元组)

这里有几个选项。 (这里的所有示例都假设 a = ((1, 2), (3, 4), (5, 6), (7, 8)),即由 4 个 (<int>, <int>) 元组组成的 tuple。)

您可以像评论中所建议的那样,为内部类型使用类型别名:

from typing import Tuple

X = Tuple[int, int]
a: Tuple[X, X, X, X]

如果整个注释仍然太长,您也可以使用类型别名,或许可以使用 typing.Annotated 来阐明代码中发生的事情:

from typing import Tuple, Annotated

X = Tuple[int, int]

IntTupleSequence = Annotated[
    Tuple[X, X, X, X],
    "Some useful metatadata here giving "
    "some documentation about this type alias"
]

a: IntTupleSequence

您也可以使用 typing.Sequence,如果您有一个长度不确定或太长而无法使用 [=19 进行注释的同源序列(可能是可变的或不可变的),这很有用=]:

from typing import Sequence, Tuple

a: Sequence[Tuple[int, int]]

您可以通过使用带文字省略号的 Tuple 实现与 Sequence 相同的效果。这里的省略号表示元组的长度不确定但类型相同。

from typing Sequence, Tuple

a: Tuple[Tuple[int, int], ...]

不过,我更喜欢使用 Sequence 而不是使用带有省略号的 Tuple。它更简洁,对我来说似乎是一种更直观的语法(...typing 模块的其他部分(例如 Callable)中用于表示类似于 Any 的意思),而且我很少发现通过告诉类型检查器我的不可变 Sequence 是特定类型 tuple 有什么好处。然而,这只是我的意见。

最后一个选择可能是对变量 a 使用 NamedTuple 而不是 tuple。但是,如果您的元组中的所有项目都是同质类型,那么这可能就有点矫枉过正了。 (NamedTuple 对于注释异构元组最有用。)