Guido van Rossum schlug vor, Mustervergleichsoperatoren zu Python hinzuzufügen

Guido van Rossum eingeführt Entwurf zur Überprüfung durch die Gemeinschaft Spezifikationen zur Implementierung von Mustervergleichsoperatoren (Match und Case) in Python. Es ist zu beachten, dass Vorschläge zur Hinzufügung von Mustervergleichsoperatoren bereits in den Jahren 2001 und 2006 veröffentlicht wurden (pep-0275, pep-3103), wurden aber zugunsten der Optimierung des „if ... elif ... else“-Konstrukts zum Kompilieren passender Ketten abgelehnt.

Die neue Implementierung ähnelt stark dem in Scala, Rust und F# bereitgestellten „Match“-Operator, der das Ergebnis eines angegebenen Ausdrucks mit einer Liste von Mustern vergleicht, die in Blöcken basierend auf dem „Case“-Operator aufgelistet sind. Im Gegensatz zum „switch“-Operator, der in C, Java und JavaScript verfügbar ist, bieten „match“-basierte Ausdrücke viel mehr große Funktionalität. Es wird darauf hingewiesen, dass die vorgeschlagenen Operatoren die Lesbarkeit des Codes verbessern, den Vergleich beliebiger Python-Objekte und das Debuggen vereinfachen und aufgrund der Möglichkeit der Erweiterung auch die Zuverlässigkeit des Codes erhöhen Statische Typprüfung.

def http_error(status):
Spielstatus:
Fall 400:
return „Bad request“
Fall 401|403|404:
Rückgabe „Nicht erlaubt“
Fall 418:
return „Ich bin eine Teekanne“
Fall _:
„Etwas anderes“ zurückgeben

Sie können beispielsweise Objekte, Tupel, Listen und beliebige Sequenzen entpacken, um Variablen basierend auf vorhandenen Werten zu binden. Es ist erlaubt, verschachtelte Vorlagen zu definieren, zusätzliche „if“-Bedingungen in der Vorlage zu verwenden, Masken („[x, y, *rest]“) und Schlüssel/Wert-Zuordnungen (z. B. {„bandwidth“: b, „latency“) zu verwenden ”: l} zum Extrahieren von „Bandbreiten“- und „Latenz“-Werten und Wörterbuch), zum Extrahieren von Untervorlagen („:="-Operator) und zum Verwenden benannter Konstanten in der Vorlage. In Klassen ist es möglich, das Matching-Verhalten mithilfe der Methode „__match__()“ anzupassen.

aus Datenklassen Datenklasse importieren

@Datenklasse
Klassenpunkt:
x:int
y:int

def whereis(point):
Matchball:
case Point(0, 0):
print("Herkunft")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
print(f"X={x}")
case Point():
print("Irgendwo anders")
Fall _:
print("Kein Punkt")

Matchball:
case Point(x, y) wenn x == y:
print(f"Y=X bei {x}")
case Point(x, y):
print(f"Nicht auf der Diagonale")

ROT, GRÜN, BLAU = 0, 1, 2
passende Farben:
Fall .RED:
print("Ich sehe rot!")
Gehäuse .GRÜN:
print("Gras ist grün")
Etui .BLU
E:
print(„Ich fühle den Blues :(“)

Ein Satz wurde zur Überprüfung vorbereitet Patches mit experimentell Implementierung vorgeschlagene Spezifikation, aber die endgültige Version ist noch diskutiert wird. Zum Beispiel vorgeschlagen Verwenden Sie anstelle des Ausdrucks „case _:“ für den Standardwert das Schlüsselwort „else:“ oder „default:“, da „_“ in anderen Kontexten als temporäre Variable verwendet wird. Fraglich ist auch die interne Organisation, die auf der Übersetzung neuer Ausdrücke in Bytecode basiert, ähnlich dem, der für „if ... elif ... else“-Konstrukte verwendet wird, was bei der Verarbeitung sehr großer Vergleichsmengen nicht die gewünschte Leistung bietet.

Source: opennet.ru

Kommentar hinzufügen