Guido van Rossum a proposé d'ajouter des opérateurs de correspondance de modèles à Python

Guido van Rossum представил projet pour examen par la communauté spécifications pour implémenter des opérateurs de correspondance de modèles (match et case) en Python. Il convient de noter que des propositions visant à ajouter des opérateurs de correspondance de modèles ont déjà été publiées en 2001 et 2006 (pep-0275, pep-3103), mais ont été rejetés en faveur de l'optimisation de la construction « if ... elif ... else » pour la compilation de chaînes de correspondance.

La nouvelle implémentation ressemble beaucoup à l'opérateur « match » fourni dans Scala, Rust et F#, qui compare le résultat d'une expression spécifiée avec une liste de modèles répertoriés dans des blocs basés sur l'opérateur « case ». Contrairement à l'opérateur « switch » disponible en C, Java et JavaScript, les expressions basées sur « match » offrent bien plus large fonctionnalité. Il est à noter que les opérateurs proposés amélioreront la lisibilité du code, simplifieront la comparaison d'objets Python arbitraires et le débogage, et augmenteront également la fiabilité du code grâce à la possibilité d'extension vérification de type statique.

def http_error (statut) :
statut du match :
cas 400:
renvoyer "Mauvaise demande"
cas 401|403|404 :
retourner "Non autorisé"
cas 418:
revenir "Je suis une théière"
cas _:
retourner "Autre chose"

Par exemple, vous pouvez décompresser des objets, des tuples, des listes et des séquences arbitraires pour lier des variables en fonction de valeurs existantes. Il est permis de définir des modèles imbriqués, d'utiliser des conditions « if » supplémentaires dans le modèle, d'utiliser des masques (« [x, y, *rest] »), des mappages clé/valeur (par exemple, {« bande passante » : b, « latence » ”: l} pour extraire les valeurs de « bande passante » et de « latence » et le dictionnaire), extraire les sous-modèles (opérateur :="), utiliser les constantes nommées dans le modèle. Dans les classes, il est possible de personnaliser le comportement de correspondance à l'aide de la méthode « __match__() ».

à partir des classes de données importer une classe de données

@classededonnées
Point de classe :
x:int
y:int

def où est (point):
balle de match:
cas Point(0, 0):
print("Origine")
cas Point(0, y):
imprimer(f"Y={y}")
cas Point(x, 0):
imprimer(f"X={x}")
Point de cas() :
print("Ailleurs")
cas _:
print("Pas un point")

balle de match:
cas Point(x, y) si x == y :
print(f"Y=X à {x}")
cas Point(x, y):
print(f"Pas sur la diagonale")

ROUGE, VERT, BLEU = 0, 1, 2
correspondre à la couleur :
cas .RED :
print("Je vois rouge!")
cas .VERT :
print("L'herbe est verte")
cas .BLU
E:
print("J'ai le blues :(")

Un ensemble a été préparé pour examen correctifs avec expérimental la mise en oeuvre spécification proposée, mais la version finale est toujours est en cours de discussion. Par exemple, proposé Au lieu de l'expression « case _: » pour la valeur par défaut, utilisez le mot-clé « else : » ou « default : », puisque « _ » dans d'autres contextes est utilisé comme variable temporaire. L'organisation interne, basée sur la traduction de nouvelles expressions en bytecode similaire à celui utilisé pour les constructions «if ... elif ... else», est également discutable, ce qui ne fournira pas les performances souhaitées lors du traitement de très grands ensembles de comparaisons.

Source: opennet.ru

Ajouter un commentaire