Les créateurs du langage Python réfléchissent à une nouvelle proposition référencée PEP 622, qui apporterait enfin une syntaxe de déclaration de correspondance de motifs à Python. Les nouvelles instructions de filtrage donneraient aux programmeurs Python des moyens plus expressifs de traiter les données structurées, sans avoir à recourir à des solutions de contournement.
La correspondance de motifs est une caractéristique commune à de nombreux langages de programmation, comme switch/case en langage C. Elle permet d'effectuer une des nombreuses actions possibles en fonction de la valeur d'une variable ou d'une expression donnée. Même si Python ne possède pas de syntaxe native pour la correspondance de motifs, le langage peut l'émuler avec des chaînes if/elif/else ou une recherche dans un dictionnaire.
PEP 622 propose une méthode pour faire correspondre une expression à un certain nombre de types de motifs en utilisant une syntaxe match/case :
match something:
case 0 | 1 | 2:
print("Small number")
case [] | [_]:
print("A short sequence")
case str() | bytes():
print("Something string-like")
case _:
print("Something else")
Les littéraux, les noms, les valeurs constantes, les séquences, un mapping (essentiellement, la présence d'une paire clé-valeur dans l'expression), une classe, un mix des éléments ci-dessus, ou toute autre expression conditionnelle font partie des types de correspondance de motifs supportés. Toute correspondance ambiguë ou impossible à résoudre entraînera une exception au moment de l'exécution.
Un nouveau protocole appelé __match__ permet aux objets de gérer les tests de concordance. Si un objet implémente la méthode __match__, il peut tester s’il correspond à un modèle de classe donné et renvoyer une réponse appropriée.
Le protocole PEP 622 permettrait également aux contrôleurs de type statique de vérifier que les correspondances peuvent être vérifiées. Un nouveau décorateur @sealed pour une classe indique aux vérificateurs de type que toute sous-classe de la classe en question est définie dans le même module que la classe de base.
Les précédentes propositions PEP visant à ajouter la correspondance de motifs - PPE 275 et PPE 3103, proposées respectivement en 2001 et 2006 - ont été rejetées en raison du manque de soutien de la communauté. La proposition PEP 3103 a été rédigée par le créateur de Python, Guido van Rossum. La nouvelle PEP, rédigée par van Rossum et plusieurs autres, vise à fournir des expressions régulières pour la correspondance d'objets, plutôt qu'un simple substitut if/elif/else. Les auteurs précisent que de nombreux aspects de cette PEP ont été inspirés par la correspondance de motifs utilisée dans les langages Rust et Scala.
La façon dont tout cela sera implementé reste encore à discuter. La mise en œuvre proposée dans la PEP 622 générerait les mêmes séquences de codes binaires qu'une chaîne if/elif/else. Des blocs switch/case plus larges pourraient perdre en performance en fonction de la logique conditionnelle incluse dans chaque case. Mais la proposition PEP indique clairement qu'un certain nombre d'approches et d'optimisations des performances (comme la mémoïsation) sont toujours possibles.
Même si la PEP finit par être acceptée, beaucoup de choses pourraient changer dans la proposition. Notamment, l’usage de else: pourrait être remis en cause au profit de case_: comme clause finale catch-all pour la déclaration switch. Dans de nombreux contextes case_ est utilisé comme une variable temporaire, et le fait d'outrepasser son comportement unilatéralement pourrait marquer un tournant pour les développeurs.
Commentaire