Sortie de Python 3.10 avec support de la correspondance de motifs

Par:
fredericmazue

mer, 06/10/2021 - 12:15

La Python Software Foundation a annoncé la sortie de Python 3.10. Une mouture très riche dont la nouveauté principale est l'arrivée de la correspondance de motifs qui avait été annoncée en février dernier.

La correspondance de motifs, ou filtrage de motifs, ou pattern matching, est une fonctionnalité très courante des langages de programmation. Réduite à sa plus simple expression avec la construction switch/case dans le langage C, elle prend des formes très évoluées avec des langages fonctionnels comme Haskell par exemple, où elle permet de traiter des données structurées.

Python est un langage qui emprunte beaucoup à la programmation fonctionnelle, mais jusqu'ici la correspondance de motifs ne faisaitt pas partie de ces fonctionnalités.

Voici quelques exemple d'utilisation de cette nouvelle fonctionnalité. Supposons une application qui reçoit une commande sous la forme d'une chaine et que cette chaine est décomposée en mots :

command = input("What are you doing next? ")
# analyze the result of command.split()

Au lieu de faire ceci  à l'ancienne :

[action, obj] = command.split()
... # interpret action, obj

ce qui pose notamment le problème du cas où l'utilisateur a saisi plus de 2 mots, on écrira ce code à base de filtrage de motif:

match command.split():
    case [action]:
        ... # interpret single-verb action
    case [action, obj]:
        ... # interpret action, obj

On peut aussi par exemple filtrer des valeurs spécifiques :

match command.split():
    case ["quit"]:
        print("Goodbye!")
        quit_game()
    case ["look"]:
        current_room.describe()
    case ["get", obj]:
        character.get(obj, current_room)
    case ["go", direction]:
        current_room = current_room.neighbor(direction)
    # The rest of your commands go here

Et comme avec les langages de programmation fonctionnels, la correspondance de motifs de Python permet de spécifier un traitement lorsque le filtrage échoue :

match command.split():
    case ["quit"]: ... 
    case ["go", direction]: ...
    case ["drop", *objects]: ...
    ... # Other cases
    case _:
        print(f"Sorry, I couldn't understand {command!r}")

La correspondance de motifs de Python est décrite en détail dans les documents PEP 634, PEP 635 et PEP 636