Python est dynamiquement typé, mais rien n’empêche de l’utiliser comme un langage statiquement typé. Le typage statique détecte des bugs à la lecture du code que les tests ne catchent pas toujours.
Annotations de types : la base
from typing import Optional, Union
# ❌ Sans types — que retourne cette fonction ?
def get_user(user_id):
pass
# ✅ Avec types — documentation et vérification automatique
def get_user(user_id: int) -> Optional[dict[str, str]]:
user = db.find(user_id)
return {"name": user.name, "email": user.email} if user else None
mypy : vérifier les types statiquement
pip install mypy
mypy src/ # vérifie tous les fichiers
mypy --strict src/ # mode strict — couvre les cas ambigus
# mypy détecte cette erreur avant l'exécution
def greet(name: str) -> str:
return f"Hello {name}"
greet(42) # error: Argument 1 has incompatible type "int"; expected "str"
Protocoles : duck typing typé
from typing import Protocol
class Sendable(Protocol):
def send(self, message: str) -> bool: ...
class EmailService:
def send(self, message: str) -> bool:
return send_email(message)
class SlackService:
def send(self, message: str) -> bool:
return post_to_slack(message)
# Les deux classes satisfont Sendable sans héritage
def notify(service: Sendable, msg: str) -> None:
service.send(msg)
Pydantic : validation de données avec le typage
from pydantic import BaseModel, EmailStr, validator
class UserCreate(BaseModel):
name: str
email: EmailStr
age: int
@validator('age')
def age_must_be_positive(cls, v: int) -> int:
if v < 0:
raise ValueError('Age must be positive')
return v
# Pydantic valide automatiquement les types et les contraintes
user = UserCreate(name="Alice", email="alice@example.com", age=-5)
# ValidationError: age must be positive
Notre formation Python couvre le typage, Pydantic et les outils de qualité de code.