Python 3.10 (octobre 2021) a introduit l'instruction match/case — une forme évoluée de « switch » bien plus puissante que dans d'autres langages. Elle permet non seulement de comparer des valeurs, mais aussi de destructurer des collections, de filtrer par type, et de capturer des parties des données. Le TOSA Avancé la teste depuis 2023.
Pourquoi match / case ?
Imaginez traiter un message sous différentes formes :
# Avec if/elif
def traiter(msg):
if isinstance(msg, str):
print(f"Texte : {msg}")
elif isinstance(msg, int):
print(f"Nombre : {msg}")
elif isinstance(msg, list) and len(msg) == 2:
print(f"Coordonnées : {msg[0]}, {msg[1]}")
elif isinstance(msg, dict) and "type" in msg:
print(f"Message typé : {msg['type']}")
else:
print("Inconnu")
traiter("Hello")
traiter(42)
traiter([3, 4])
traiter({"type": "error", "code": 500})La même chose avec match/case :
def traiter(msg):
match msg:
case str(s):
print(f"Texte : {s}")
case int(n):
print(f"Nombre : {n}")
case [x, y]:
print(f"Coordonnées : {x}, {y}")
case {"type": t}:
print(f"Message typé : {t}")
case _:
print("Inconnu")
traiter("Hello")
traiter(42)
traiter([3, 4])
traiter({"type": "error", "code": 500})Plus concis, plus lisible, et surtout : on capture directement les parties intéressantes dans des variables.
Syntaxe de base
match expression:
case motif1:
# code si expression correspond à motif1
case motif2:
# code si expression correspond à motif2
case _:
# cas par défaut (wildcard)Comme pour if/elif, le premier case qui correspond est exécuté — un seul.
Le wildcard _
_ (un simple underscore) est un motif spécial qui correspond à tout. On l'utilise comme cas par défaut.
def jour_semaine(n):
match n:
case 1: return "Lundi"
case 2: return "Mardi"
case 3: return "Mercredi"
case 4: return "Jeudi"
case 5: return "Vendredi"
case 6: return "Samedi"
case 7: return "Dimanche"
case _: return "Jour invalide"
for n in [1, 3, 7, 99]:
print(f"{n} → {jour_semaine(n)}")Motifs littéraux
Les plus simples : comparer à une valeur littérale.
def reponse(code):
match code:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Server Error"
case _:
return f"Code {code}"
print(reponse(200))
print(reponse(404))
print(reponse(418))Alternatives avec |
Pour matcher plusieurs valeurs d'un coup, utilisez | (pipe) :
def categorie_http(code):
match code:
case 200 | 201 | 204:
return "Succès"
case 301 | 302:
return "Redirection"
case 400 | 401 | 403 | 404:
return "Erreur client"
case 500 | 502 | 503:
return "Erreur serveur"
case _:
return "Autre"
for code in [200, 301, 404, 502, 418]:
print(f"{code} → {categorie_http(code)}")Capture de variables
Un case peut capturer une valeur dans une variable — très pratique.
def decrire(valeur):
match valeur:
case 0:
return "zéro"
case 1:
return "un"
case n:
return f"autre nombre : {n}" # n capture la valeur
print(decrire(0))
print(decrire(1))
print(decrire(42))