Aller au contenu
Contrôle de flux

match / case

match compare une valeur à des motifs (littéraux, tuples, dictionnaires) et exécute le premier qui correspond. Il remplace une longue suite d'elif quand on aiguille selon la forme d'une donnée.

  • match
  • case
  • filtrage par motif
  • pattern matching
  • aiguillage

Syntaxe

Modèle
match valeur:    case motif1:        ...    case motif2 | motif3:          # l'un ou l'autre        ...    case {"cle": variable} if condition:        ...    case _:        ...                        # tous les autres cas

Exemple

Exemple concret
# Aiguiller des événements de logdef traiter(evenement):    match evenement:        case {"type": "connexion", "user": user}:            return f"Bienvenue {user}"        case {"type": "erreur", "code": 404 | 410}:            return "Page introuvable"        case {"type": "erreur", "code": code} if code >= 500:            return f"Incident serveur {code}"        case _:            return "Ignoré"print(traiter({"type": "connexion", "user": "lea"}))  # → Bienvenue leaprint(traiter({"type": "erreur", "code": 410}))       # → Page introuvableprint(traiter({"type": "erreur", "code": 503}))       # → Incident serveur 503print(traiter({"type": "clic", "x": 12}))             # → Ignoré

À retenir

  1. match existe depuis Python 3.10. case _: attrape tout le reste ; sans lui, une valeur imprévue ne déclenche aucun bloc et aucune erreur.
  2. Un motif dictionnaire n'exige que les clés citées : {"type": "erreur"} correspond aussi à un dictionnaire qui contient d'autres clés.
  3. Une garde if placée après le motif ajoute une condition : case (x, y) if x == y:.
  4. Piège : un nom nu dans un case capture la valeur au lieu de la comparer. case seuil: attrape tout, même si une variable seuil existe ; pour comparer à une constante, utilisez un littéral ou un nom pointé (Statut.ACTIF).
  5. Pour un simple test d'égalité sur deux ou trois valeurs, if / elif reste plus lisible.

Voir aussi