4.5. Type Annotation Sequences¶
Before Python 3.9 you need
from typing import List, Tuple, Set, Frozenset
Since Python 3.9: PEP 585 -- Type Hinting Generics In Standard Collections
>>> DATA = [
... (5.8, 2.7, 5.1, 1.9, 'virginica'),
... (5.1, 3.5, 1.4, 0.2, 'setosa'),
... (5.7, 2.8, 4.1, 1.3, 'versicolor')]
>>>
>>> x = DATA[0][-1]
>>> x
>>> # IDE don't know what type is species
>>> # and cannot give hints for autocompletion
>>> DATA = [
... (5.8, 2.7, 5.1, 1.9, 'virginica'),
... (5.1, 3.5, 1.4, 0.2, 'setosa'),
... (5.7, 2.8, 4.1, 1.3, 'versicolor')]
>>>
>>> x: str = DATA[0][-1]
>>> x
>>> # IDE knows exactly what type is species
>>> # and what methods hint for autocompletion
4.5.1. List of Lists¶
Declaration:
>>> data: list
>>> data: list[list]
>>> data: list[list[int]]
Example:
>>> data: list = [
... [1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]]
>>> data: list[list] = [
... [1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]]
>>> data: list[list[int]] = [
... [1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]]
4.5.2. List of Tuples¶
Declaration:
>>> data: list
>>> data: list[tuple]
>>> data: list[tuple[float, float, float, float, str]]
Example:
>>> data: list = [
... (4.7, 3.2, 1.3, 0.2, 'setosa'),
... (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... (7.6, 3.0, 6.6, 2.1, 'virginica')]
>>> data: list[tuple] = [
... (4.7, 3.2, 1.3, 0.2, 'setosa'),
... (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... (7.6, 3.0, 6.6, 2.1, 'virginica')]
>>> data: list[tuple[float, float, float, float, str]] = [
... (4.7, 3.2, 1.3, 0.2, 'setosa'),
... (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... (7.6, 3.0, 6.6, 2.1, 'virginica')]
4.5.3. List of Dicts¶
>>> data: list[dict] = [
... {'features': [4.7, 3.2, 1.3, 0.2], 'label': 'setosa'},
... {'features': [7.0, 3.2, 4.7, 1.4], 'label': 'versicolor'},
... {'features': [7.6, 3.0, 6.6, 2.1], 'label': 'virginica'}]
>>> data: list[dict[str, list[float] | str]] = [
... {'features': [4.7, 3.2, 1.3, 0.2], 'label': 'setosa'},
... {'features': [7.0, 3.2, 4.7, 1.4], 'label': 'versicolor'},
... {'features': [7.6, 3.0, 6.6, 2.1], 'label': 'virginica'}]
4.5.4. Aliases¶
Declaration:
>>> row = tuple[int, int, int]
>>> data: list[row]
Example:
>>> Iris = tuple[float, float, float, float, str]
>>>
>>> data: list[Iris] = [
... (4.7, 3.2, 1.3, 0.2, 'setosa'),
... (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... (7.6, 3.0, 6.6, 2.1, 'virginica')]
>>> features = list[float]
>>> label = str
>>>
>>> data: list[dict[str, features|label]] = [
... {'features': [4.7, 3.2, 1.3, 0.2], 'label': 'setosa'},
... {'features': [7.0, 3.2, 4.7, 1.4], 'label': 'versicolor'},
... {'features': [7.6, 3.0, 6.6, 2.1], 'label': 'virginica'}]
4.5.5. Unions¶
Declaration:
>>> a = tuple[str, str, str]
>>> b = tuple[int, int, int]
>>> c = tuple[float, float, float]
>>>
>>> data: list[a | b | c]
>>> header = tuple[str, str, str]
>>> row = tuple[int, int, int]
>>>
>>> data: tuple[header,row,...]
Example:
>>> Header = tuple[str, str, str, str, str]
>>> Row = tuple[float, float, float, float, str]
>>>
>>> DATA: tuple[Header,Row,...] = (
... ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
... (5.8, 2.7, 5.1, 1.9, 'virginica'),
... (5.1, 3.5, 1.4, 0.2, 'setosa'),
... (5.7, 2.8, 4.1, 1.3, 'versicolor'),
... (6.3, 2.9, 5.6, 1.8, 'virginica'),
... (6.4, 3.2, 4.5, 1.5, 'versicolor'),
... (4.7, 3.2, 1.3, 0.2, 'setosa'))
4.5.6. Use Case - 0x01¶
>>> GeographicCoordinate = tuple[float, float]
>>>
>>> locations: list[GeographicCoordinate] = [
... (25.91375, -60.15503),
... (-11.01983, -166.48477),
... (-11.01983, -166.48477)]
4.5.7. Use Case - 0x02¶
>>> data: list[list|tuple|set] = [
... [1, 2, 3],
... (4, 5, 6),
... {7, 8, 9}]
>>> data: list[list[int] | tuple[int, ...] | set[int]] = [
... [1, 2, 3],
... (4, 5, 6),
... {7, 8, 9}]
>>> row = list[int] | tuple[int, ...] | set[int]
>>>
>>> data: list[row] = [
... [1, 2, 3],
... (4, 5, 6),
... {7, 8, 9}]
4.5.8. Further Reading¶
More information in Type Annotations
More information in CI/CD Type Checking