Why does the typehint tuple[int]
behave differently from list[int]
?
This gives me a visual warning:
def func_with_tuple(x: tuple[int]):
pass
func_with_tuple((1, 2, 3))
# ^
# warning _________|
Expected type 'tuple[int]', got 'tuple[int, int, int]' instead
while this does not:
def func_with_list(x: list[int]):
pass
func_with_list([1, 2, 3])
How should I typehint a tuple
of ints
then?
So, looking at PEP 484 where the Python type annotation system was defined, it states:
Tuple
, used by listing the element types, for exampleTuple[int, int, str]
. The empty tuple can be typed asTuple[()]
. Arbitrary-length homogeneous tuples can be expressed using one type and ellipsis, for exampleTuple[int, ...]
. (The...
here are part of the syntax, a literal ellipsis.)
Note, that PEP uses typing.Tuple
, which is currently deprecated in favor of tuple
, but it still documents this same thing.
So,
tuple[int]
Means *a length 1 tuple with an int
.
tuple
objects and list
objects are used differently. A list should be thought of as an arbitrary-sized, homogenous sequence. tuple
objects are more like record types, fixed-size, with possibly heterogenous types. Hence, their type annotation has different semantics.
So you either want:
tuple[int, ...]
Or
tuple[int, int, int]