Guido van Rossum foreslog at tilføje mønstermatchende operatorer til Python

Guido van Rossum indsendt udkast til fællesskabsgennemgang specifikationer til implementering af mønstertilpasningsoperatorer (match og case) i Python. Det skal bemærkes, at forslag om at tilføje mønstermatchende operatører allerede er blevet offentliggjort i 2001 og 2006 (pep-0275, pep-3103), men blev afvist til fordel for optimering af "if ... elif ... else"-konstruktionen til kompilering af matchende kæder.

Den nye implementering minder meget om "match"-operatoren i Scala, Rust og F#, som sammenligner resultatet af et specificeret udtryk med en liste over mønstre opført i blokke baseret på "case"-operatoren. I modsætning til "switch"-operatoren, der er tilgængelig i C, Java og JavaScript, tilbyder "match"-baserede udtryk meget mere bred funktionalitet. Det bemærkes, at de foreslåede operatører vil forbedre kodens læsbarhed, forenkle sammenligningen af ​​vilkårlige Python-objekter og debugging og også øge kodens pålidelighed takket være muligheden for udvidet statisk typekontrol.

def http_error(status):
kampstatus:
sag 400:
returner "Dårlig anmodning"
sag 401|403|404:
returner "Ikke tilladt"
sag 418:
returnere "Jeg er en tekande"
sag_:
returnere "Noget andet"

For eksempel kan du pakke objekter, tupler, lister og vilkårlige sekvenser ud for at binde variabler baseret på eksisterende værdier. Det er tilladt at definere indlejrede skabeloner, bruge yderligere "hvis"-betingelser i skabelonen, bruge masker ("[x, y, *rest]"), nøgle-/værditilknytninger (f.eks. {"båndbredde": b, "latency" ”: l} for at udtrække "båndbredde" og "latency" værdier og ordbog), udtræk underskabeloner (":=" operator), brug navngivne konstanter i skabelonen. I klasser er det muligt at tilpasse matchningsadfærd ved hjælp af "__match__()" metoden.

fra dataklasser importer dataklasse

@dataklasse
klasse punkt:
x:int
y:int

def whereis(punkt):
matchbold:
case Point(0, 0):
print ("Oprindelse")
case Point(0, y):
print(f"Y={y}")
case Punkt(x, 0):
print(f"X={x}")
case Point():
print("Et andet sted")
sag_:
print("Ikke et punkt")

matchbold:
case Punkt(x, y) hvis x == y:
print(f"Y=X ved {x}")
case Punkt(x, y):
print(f"Ikke på diagonalen")

RØD, GRØN, BLÅ = 0, 1, 2
match farve:
sag .RED:
print ("Jeg ser rødt!")
sag .GRØN:
print("Græs er grønt")
sag .BLU
E:
print(“Jeg mærker blues :(“)

Der er udarbejdet et sæt til gennemgang plastre med eksperimentel implementering foreslået specifikation, men den endelige version er stadig diskuteret. For eksempel tilbydes I stedet for udtrykket "case _:" for standardværdien, skal du bruge nøgleordet "else:" eller "default:", da "_" i andre sammenhænge bruges som en midlertidig variabel. Også tvivlsom er den interne organisation, som er baseret på at oversætte nye udtryk til bytekode svarende til den, der bruges til "if ... elif ... else" konstruktioner, som ikke vil give den ønskede ydeevne ved behandling af meget store sæt af sammenligninger.

Kilde: opennet.ru

Tilføj en kommentar