Qu'est-ce que l'instruction match ... case en python ?

Qu'est-ce que le match case en Python ?

Le match case, connu sous le nom de Structural Pattern Matching, est une structure de contrôle apparue avec la version 3.10 de Python. Elle permet de comparer une valeur à une série de modèles.

La syntaxe se décompose de la manière suivante :

  • Le mot-clé match suivi de la variable à tester

  • Les blocs case définissant les motifs attendus

Prenons un exemple simple :

identite_secrete = "Bruce Wayne"

match identite_secrete:
    case "Bruce Wayne":
        print("Je suis la nuit ! 🦇")
    case "Clark Kent":
        print("C'est un oiseau ? Un avion ? Non ! 🦸")
    case "Tony Stark":
        print("Je suis Iron Man. 🤖")
    case "Patrick":
        print("Bob l'éponge au rapport ! 🍍")
    case _:
        print("Juste un citoyen ordinaire... ou pas ? 🕵️")

# Affiche : Je suis la nuit ! 🦇
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

L'underscore _ sert de caractère générique. Il correspond à n'importe quelle valeur. On pourrait le voir comme le else final pour capturer tous les cas non traités précédemment.

Quand utiliser match case et if else ?

match case a la capacité de déstructurer des séquences ou des objets. Dans ce cas, il peut être plus intéressant d'utiliser match case.

Prenons un exemple :

action_joueur = "INVOQUER Dragon 999"

# On découpe la chaîne pour obtenir une liste : ["INVOQUER", "Dragon", "999"]
match action_joueur.split():
    case ["DORMIR"]:
        print("Zzz... Le héros récupère ses PV 💖")

    # Python voit une liste de 2 éléments commençant par "MANGER".
    # Il capture AUTOMATIQUEMENT le 2ème élément et le met dans la variable 'nourriture'.
    case ["MANGER", nourriture]:
        print(f"Miam ! Vous dévorez : {nourriture} 🍗")

    # Ici, Python capture le 2ème élément dans 'creature' et le 3ème dans 'niveau'.
    # On peut ensuite utiliser ces variables tout de suite dans le 'if' (Guard).
    case ["INVOQUER", creature, niveau] if int(niveau) > 100:
        print(f"😱 DANGER ! Le {creature} niveau {niveau} est incontrôlable ! Fuite !")

    case ["INVOQUER", creature, niveau]:
        print(f"Un {creature} de niveau {niveau} apparaît docilement ✨")

    case _:
        print("Commande inconnue 😵")
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Regardez les variables nourriture, creature et niveau. Python va les créer pour vous pendant le match. En effet, dans case ["INVOQUER", creature, niveau], les variables creature et niveau sont des noms que vous choisissez. Si la liste possède bien 3 éléments et commence par "INVOQUER", alors le deuxième élément sera assigné à la variable creature et le troisième à la variable niveau.

Vous avez certainement remarqué le if dans case ["INVOQUER", creature, niveau] if int(niveau) > 100: ? C'est ce que l'on appelle un guard. En effet, on peut parfois vouloir vérifier une valeur spécifique à l'intérieur d'une structure.
Python va d'abord vérifier si le motif correspond et, si c'est le cas, il évalue ensuite la condition du guard.

Arrivés là, on se pose à peu près tous la même question : comment Python décide-t-il si cela correspond ?

Reprenons ce case ["INVOQUER", creature, niveau]. En réalité, Python suit une logique stricte :

  • La structure : la liste doit contenir exactement 3 éléments

  • Le filtre : le premier élément doit être exactement "INVOQUER"

  • Les captures (variables) : creature et niveau ne sont pas entre guillemets ; il s'agit de variables libres

Est-ce que l'on pourrait n'utiliser que des variables ? Oui 🤯. Par exemple, case [action, sujet, quantite] accepterait n'importe quelle liste de 3 éléments et remplirait les 3 variables correspondantes.

Et si j'utilisais if/else ?

On pourrait très bien utiliser une structure avec if elif else :

action_joueur = "INVOQUER Dragon 999"
parts = action_joueur.split()

if parts == ["DORMIR"]:
    print("Zzz... Le héros récupère ses PV 💖")

elif len(parts) == 2 and parts[0] == "MANGER":
    nourriture = parts[1]
    print(f"Miam ! Vous dévorez : {nourriture} 🍗")

elif len(parts) == 3 and parts[0] == "INVOQUER":
    creature = parts[1]
    niveau = parts[2]

    if int(niveau) > 100:
        print(f"😱 DANGER ! Le {creature} niveau {niveau} est incontrôlable ! Fuite !")
    else:
        print(f"Un {creature} de niveau {niveau} apparaît docilement ✨")

else:
    print("Commande inconnue 😵")
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

On remarque que la structure match case permet de gérer la vérification de la longueur de la liste, l'assignation aux variables et la condition de manière plus concise et plus simple.

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.