对元组进行类型提示但又不会太冗长

Hit*_*uca 4 python type-hinting python-typing

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

例子:

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

a: Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, int], Tuple[int, int]]
Run Code Online (Sandbox Code Playgroud)

我正在寻找看起来像这样的东西

a: Tuple[5*Tuple[int, int]]
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ood 5

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

正如评论中所建议的,您可以仅使用内部类型的类型别名:

from typing import Tuple

X = Tuple[int, int]
a: Tuple[X, X, X, X]
Run Code Online (Sandbox Code Playgroud)

如果整个注释仍然太长,您还可以使用类型别名,也许可以用来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
Run Code Online (Sandbox Code Playgroud)

您还可以使用typing.Sequence,如果您有一个同质序列(可能是可变的或不可变的),该序列要么长度不确定,要么太长而无法使用 进行注释,这非常有用typing.Tuple

from typing import Sequence, Tuple

a: Sequence[Tuple[int, int]]
Run Code Online (Sandbox Code Playgroud)

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

from typing Sequence, Tuple

a: Tuple[Tuple[int, int], ...]
Run Code Online (Sandbox Code Playgroud)

不过,我更喜欢使用Sequence省略号Tuple。它更简洁,对我来说似乎是一种更直观的语法(...用于表示与模块Any其他部分类似的东西typing,例如Callable),并且我很少发现通过告诉类型检查器我的不可变Sequence是特定的类型可以获得任何东西tuple。不过,这只是我的意见。

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