====== Annotations ====== * https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html * https://zestedesavoir.com/tutoriels/954/notions-de-python-avancees/2-functions/2-annotations-signatures/ * https://docs.python.org/3/library/typing.html * https://medium.com/@yothinix/python-type-annotation-and-why-we-need-it-91820a708170 En python il est possible de faire des annotations: def addition(a: int, b: int) -> int: return a + b Le module **typing** présente une collection de classes pour composer des types. Ce module a été introduit dans Python 3.5, et n’est donc pas disponible dans les versions précédentes du langage. Dans notre fonction addition, nous voudrions en fait que les int, float et complex soient admis. Nous pouvons pour cela utiliser le type Union du module typing : from typing import Union Number = Union[int, float, complex] def addition(a: Number, b: Number) -> Number: return a + b Nous utilisons ici **Union** mais il en existe d'autres comme par exemple : * **List[str]** : Une liste de chaînes de caractères ; * **Sequence[str]** : Une séquence (liste/tuple/etc.) de chaînes de caractères ; * **Callable[[str, int], str]** : Un callable prenant deux paramètres de types //str// et //int// respectivement, et retournant un objet //str// def foo(arg: Optional[int] = None) -> None: ... def foo(arg: Optional[List[Union[int, str]]] = None) -> None: ... max_value : int = 10 # Définition d'une variable max_value annotée comme int min_value : int # Annotation seule, la variable n'est pas définie dans ce cas from typing import List Vector = List[float] def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] from typing import Dict, Tuple, Sequence ConnectionOptions = Dict[str, str] Address = Tuple[str, int] Server = Tuple[Address, ConnectionOptions] def broadcast_message(message: str, servers: Sequence[Server]) -> None: ... # The static type checker will treat the previous type signature as # being exactly equivalent to this one. def broadcast_message( message: str, servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None: ... from typing import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body def async_query(on_success: Callable[[int], None], on_error: Callable[[int, Exception], None]) -> None: # Body from typing import Any # OK def foo(item: Any) -> int: ... T = TypeVar('T') # Can be anything A = TypeVar('A', str, bytes) # Must be str or bytes def repeat(x: T, n: int) -> Sequence[T]: """Return a list containing n references to x.""" return [x]*n def longest(x: A, y: A) -> A: """Return the longest of two strings.""" return x if len(x) >= len(y) else y def fib(n: int) -> Iterator[int]: a, b = 0, 1 while a < n: yield a a, b = b, a+b