Guido van Rossum foreslo å legge til mønstertilpasningsoperatører til Python

Guido van Rossum innsendt utkast til samfunnsgjennomgang spesifikasjoner for implementering av mønstertilpasningsoperatorer (match og case) i Python. Det skal bemerkes at forslag om å legge til mønstertilpasningsoperatører allerede har blitt publisert i 2001 og 2006 (pep-0275, pep-3103), men ble avvist til fordel for å optimalisere "if ... elif ... else"-konstruksjonen for å kompilere matchende kjeder.

Den nye implementeringen ligner mye på "match"-operatoren i Scala, Rust og F#, som sammenligner resultatet av et spesifisert uttrykk med en liste over mønstre oppført i blokker basert på "case"-operatoren. I motsetning til "switch"-operatoren tilgjengelig i C, Java og JavaScript, tilbyr "match"-baserte uttrykk mye mer bred funksjonalitet. Det bemerkes at de foreslåtte operatørene vil forbedre lesbarheten til koden, forenkle sammenligningen av vilkårlige Python-objekter og feilsøking, og også øke påliteligheten til koden takket være muligheten for utvidet statisk typekontroll.

def http_error(status):
kampstatus:
sak 400:
returner "Dårlig forespørsel"
sak 401|403|404:
returner "Ikke tillatt"
sak 418:
returner "Jeg er en tekanne"
sak_:
returner "Noe annet"

Du kan for eksempel pakke ut objekter, tupler, lister og vilkårlige sekvenser for å binde variabler basert på eksisterende verdier. Det er tillatt å definere nestede maler, bruke ytterligere "hvis"-betingelser i malen, bruke masker ("[x, y, *rest]"), nøkkel-/verditilordninger (for eksempel {"båndbredde": b, "latency" ”: l} for å trekke ut verdier for "båndbredde" og "latency" og ordbok), trekke ut undermaler (":=" operator), bruk navngitte konstanter i malen. I klasser er det mulig å tilpasse samsvarsatferd ved å bruke "__match__()"-metoden.

fra dataklasser importer dataklasse

@dataklasse
klasse poeng:
x:int
y:int

def whereis (punkt):
match poeng:
case Point(0, 0):
print("Opprinnelse")
sakspunkt(0, y):
print(f"Y={y}")
kasuspunkt(x, 0):
print(f"X={x}")
sakspunkt():
print("Et annet sted")
sak_:
print("Ikke et poeng")

match poeng:
kasuspunkt(x, y) hvis x == y:
print(f"Y=X ved {x}")
sakspunkt(x, y):
print(f"Ikke på diagonalen")

RØD, GRØNN, BLÅ = 0, 1, 2
match farge:
etui .RED:
print ("Jeg ser rødt!")
sak .GRØNN:
print("Gress er grønt")
etui .BLU
E:
print(“I'm feeling the blues :(“)

Det er utarbeidet et sett for gjennomgang lapper med eksperimentell gjennomføring foreslått spesifikasjon, men den endelige versjonen er fortsatt diskutert. For eksempel, tilbys I stedet for uttrykket "case _:" for standardverdien, bruk nøkkelordet "else:" eller "default:", siden "_" i andre sammenhenger brukes som en midlertidig variabel. Også tvilsom er den interne organisasjonen, som er basert på å oversette nye uttrykk til bytekode lik den som brukes for «if ... elif ... else»-konstruksjoner, som ikke vil gi ønsket ytelse ved behandling av svært store sett med sammenligninger.

Kilde: opennet.ru

Legg til en kommentar