Prépa Python

Avancé — chapitre 38 sur 54

Pattern matching avec match / case

La syntaxe structurée de Python 3.10 pour des conditions élégantes

55 minAbonnés

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 :

python
# 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 :

python
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

python
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.

python
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.

python
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) :

python
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.

python
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))

Suite réservée aux abonnés

Débloquez l'intégralité du parcours

Les 54 chapitres, les exercices corrigés automatiquement, les examens blancs et le suivi de votre progression.

Voir les offresChapitres en accès libre

Déjà un accès ? Connectez-vous.