Guido van Rossum udkast til samfundsbehandling at implementere mønstermatchningsoperatorer (match og case) i Python. Det skal bemærkes, at forslag om at tilføje mønstermatchningsoperatorer allerede blev offentliggjort i 2001 og 2006 (, ), men blev opgivet til fordel for at optimere "if … elif … else"-konstruktionen til at konstruere matchende kæder.
Den nye implementering minder meget om match-operatoren i Scala, Rust og F#, som sammenligner resultatet af et bestemt udtryk med en liste over mønstre, der er angivet i case-baserede blokke. I modsætning til switch-operatoren, der er tilgængelig i C, Java og JavaScript, tilbyder matchbaserede udtryk meget mere. . Det bemærkes, at de foreslåede operatorer vil forbedre kodens læsbarhed, forenkle sammenligningen af vilkårlige Python-objekter og fejlfinding, og også øge kodens pålidelighed på grund af muligheden for udvidet .
def http_error(status):
kampstatus:
sag 400:
returner "Forkert anmodning"
sag 401|403|404:
returner "Ikke tilladt"
sag 418:
returner "Jeg er en tekande"
sag _:
returner "Noget andet"
For eksempel er det muligt at udpakke objekter, tupler, lister og vilkårlige sekvenser for at binde variabler baseret på de tilgængelige værdier. Det er muligt at definere indbyggede skabeloner, bruge yderligere "if"-betingelser i skabelonen, bruge masker ("[x, y, *rest]"), kortlægge nøgle/værdi-par (f.eks. {"bandwidth": b, "latency": l} for at udtrække "bandwidth"- og "latency"-værdierne og en ordbog), udtrække underskabeloner (":="-operatoren) og bruge navngivne konstanter i skabelonen. Klasser kan tilpasse matchningsadfærden ved hjælp af metoden "__match__()".
importer dataklasse fra dataklasser
@dataklasse
klasse punkt:
x:int
y:int
def hvor(punkt):
matchpunkt:
Tilfælde Punkt(0, 0):
print("Oprindelse")
Tilfælde Punkt(0, y):
print(f»Y={y}»)
Tilfælde Punkt(x, 0):
udskriv(f»X={x}»)
case Point():
print("Et andet sted")
sag _:
print("Ikke et punkt")
matchpunkt:
Tilfælde Punkt(x, y) hvis x == y:
print(f»Y=X ved {x}»)
Tilfælde Punkt(x, y):
print(f"Ikke på diagonalen")
RØD, GRØN, BLÅ = 0, 1, 2
matchende farve:
etui .RED:
print(«Jeg ser rødt!»)
etui .GRØN:
print("Græsset er grønt")
etui .BLÅ
E:
print(“Jeg føler mig trist :(“)
Der er udarbejdet et sæt materialer til gennemgang. med eksperimentel den foreslåede specifikation, men den endelige version er stadig . For eksempel I stedet for at bruge udtrykket "case _:" for standardværdien, skal du bruge nøgleordet "else:" eller "default:", da "_" bruges som en midlertidig variabel i andre sammenhænge. Den interne organisering er også tvivlsom, da den er baseret på at oversætte nye udtryk til bytekode svarende til den, der bruges til "if ... elif ... else"-konstruktioner, da den ikke vil give den ønskede ydeevne ved behandling af meget store sæt af sammenligninger.
Kilde: opennet.ru
