Guido van Rossum föreslog att lägga till mönstermatchningsoperatorer till Python

Guido van Rossum lämnats utkast för granskning av samhället specifikationer för implementering av mönstermatchningsoperatorer (matchning och fall) i Python. Det bör noteras att förslag om att lägga till mönstermatchningsoperatörer redan har publicerats 2001 och 2006 (pep-0275, pep-3103), men avvisades till förmån för att optimera "if ... elif ... else"-konstruktionen för att kompilera matchande kedjor.

Den nya implementeringen är ungefär som "match"-operatorn som tillhandahålls i Scala, Rust och F#, som jämför resultatet av ett specificerat uttryck med en lista med mönster listade i block baserat på "case"-operatorn. Till skillnad från "switch"-operatorn som finns i C, Java och JavaScript, erbjuder "match"-baserade uttryck mycket mer bred funktionalitet. Det noteras att de föreslagna operatörerna kommer att förbättra kodens läsbarhet, förenkla jämförelsen av godtyckliga Python-objekt och felsökning, och även öka kodens tillförlitlighet på grund av möjligheten till utökad statisk typkontroll.

def http_error(status):
matchstatus:
fall 400:
returnera "Dålig begäran"
fall 401|403|404:
returnera "Inte tillåtet"
fall 418:
returnera "Jag är en tekanna"
fall_:
returnera "Något annat"

Du kan till exempel packa upp objekt, tupler, listor och godtyckliga sekvenser för att binda variabler baserat på befintliga värden. Det är tillåtet att definiera kapslade mallar, använda ytterligare "om"-villkor i mallen, använda masker ("[x, y, *rest]"), nyckel-/värde-mappningar (till exempel {"bandwidth": b, "latency" ”: l} för att extrahera "bandbredd" och "latens" värden och ordbok), extrahera submallar (":=" operator), använd namngivna konstanter i mallen. I klasser är det möjligt att anpassa matchningsbeteendet med metoden "__match__()".

från dataklasser importera dataklass

@dataklass
klass poäng:
x:int
y:int

def whereis(punkt):
matchpunkt:
case Point(0, 0):
print("Ursprung")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
print(f"X={x}")
case Point():
print("någon annanstans")
fall_:
print("Inte en poäng")

matchpunkt:
case Point(x, y) om x == y:
print(f"Y=X vid {x}")
fallpunkt(x, y):
print(f"Inte på diagonalen")

RÖD, GRÖN, BLÅ = 0, 1, 2
matcha färg:
fall .RED:
print("Jag ser rött!")
case .GREEN:
print("Gräs är grönt")
fall .BLU
E:
print(“I'm feeling the blues :(“)

En uppsättning har förberetts för granskning plåster med experimentell genomförande föreslagna specifikationen, men den slutliga versionen är fortfarande diskuteras. Till exempel erbjuds Istället för uttrycket "case _:" för standardvärdet, använd nyckelordet "else:" eller "default:", eftersom "_" i andra sammanhang används som en temporär variabel. Också tveksam är den interna organisationen, som bygger på att översätta nya uttryck till bytekod liknande den som används för "if ... elif ... else"-konstruktioner, som inte kommer att ge önskad prestanda vid bearbetning av mycket stora uppsättningar av jämförelser.

Källa: opennet.ru

Lägg en kommentar