Typing Tuples in Python
Python added support for type hints in 3.5. These are not typing as you may be used to in other languages since they have no effect on the compilation to bytecode nor at runtime, but rather hints for the (tools of the) developer.
The code above doesn’t fail when you call
print_int("foo") even though
n is “typed” as an
int. This is because
n: int is just a hint.
While you can check for type issues by running
mypy by hand, type hints become really
powerful when your editor/IDE supports them.
Types for collections can specify the inner types: a list (
List) that contains strings (
str) would be
In the snippet above, the last line is highlighted as an error in any good IDE, and
mypy would complain about it.
Other container types exist as well, and they can be nested:
Sequence[x] and other
Set[x], one would expect
Tuple[x] to be a hint for a tuple
x. Well… no.
This is confusing at first, but
Tuple[str] types a tuple of a single element of type
str. To add
more elements, you need to type them as well: a pair of ints would be
Tuple[int, int], while a triplet of a string,
a float and a boolean would be
Tuple[str, int, bool].
While tuples can be used as sequences (e.g. for immutable/hashable equivalents to lists), I’d argue that their primary use is for fixed-length representations, such as pairs of results:
In this snippet,
match_object returns a tuple of a list of floats and a list of integers
If you still want to type arbitrary-length homogeneous tuples, there’s a syntax for that:
types a tuple of any length, including 0, that contains only
int elements (and yes,
... is valid in Python).
For this and other interrogations (how to type a generator?), Mypy has a useful type hints cheat sheet.
TL;DR: if you know the size of the tuple, use
Tuple[x, x, x], etc. If you don’t,
Tuple[x, ...], but all elements must be of type