类型提示一个元组而不是太冗长
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
对于注释异构元组最有用。)
有没有一种方法可以键入提示元素的元组,而不必多次定义每个内部元素?
示例:
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
对于注释异构元组最有用。)