Typage (annotations)
Progression
#Typage statique (annotations)
À quoi ça sert: clarifier les intentions, obtenir une meilleure autocomplétion et détecter tôt des incohérences. Comment: annotations, génériques, Protocols et dataclasses; vérification via mypy/pyright sans modifier l’exécution.
#Bases
1from typing import List, Optional, Dict2 3def greet(name: str, times: int = 1) -> str:4 return ' '.join([f'Bonjour {name}'] * times)5 6users: List[str] = ['Ada', 'Linus']7config: Dict[str, Optional[int]] = {'port': 8080, 'retries': None}
#Génériques et Protocols
1from typing import TypeVar, Iterable, Protocol2 3T = TypeVar('T')4 5def first(xs: Iterable[T]) -> T | None:6 for x in xs: return x7 return None8 9class SupportsLen(Protocol):10 def __len__(self) -> int: ...11 12def is_empty(x: SupportsLen) -> bool:13 return len(x) == 0
Le typage via Protocols est structurel: une classe n’a pas besoin d’hériter explicitement, il suffit qu’elle fournisse les attributs et méthodes requis. Les unions (A | B
) et Optional[T]
décrivent des alternatives; Literal
contraint une valeur à un ensemble fini. Le typage est graduel: on peut annoter progressivement et laisser l’outil affiner les types après des gardes isinstance
(narrowing) sans cast explicite.
#Dataclasses
1from dataclasses import dataclass2 3@dataclass4class User:5 id: int6 name: str7 email: str | None = None8 9u = User(1, 'Ada')
Les TypedDict
décrivent des dictionnaires à clés connues, utiles pour des schémas JSON. Les décorateurs @overload
documentent des signatures alternatives selon les arguments. Pour typer une bibliothèque tierce sans annotations, on peut ajouter des stubs .pyi
et les publier à côté du paquet ou via types-...
.
#Animation: bénéfices du typage
Les annotations ne valident rien par défaut à l’exécution; utilisez pydantic
/attrs
si besoin de validation runtime.