Guido van Rossum Entwurf zur ĂberprĂŒfung durch die Gemeinschaft 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 (, ), 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 . 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 .
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 mit experimentell vorgeschlagene Spezifikation, aber die endgĂŒltige Version ist noch . Zum Beispiel 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
