Guido van Rossum tegi ettepaneku lisada Pythoni mustrite sobitamise operaatorid

Guido van Rossum tutvustatud eelnõu kogukonna ülevaatamiseks spetsifikatsioonid mustrite sobitamise operaatorite (match ja suurtähtede) rakendamiseks Pythonis. Tuleb märkida, et ettepanekud mustrite sobitamise operaatorite lisamiseks on avaldatud juba aastatel 2001 ja 2006 (pep-0275, pep-3103), kuid need lükati tagasi sobivate ahelate koostamiseks konstruktsiooni „if ... elif ... else” optimeerimise poolt.

Uus teostus sarnaneb paljuski Scala, Rust ja F# pakutavale operaatorile "match", mis võrdleb määratud avaldise tulemust plokkides loetletud mustrite loendiga operaatori "case" alusel. Erinevalt C-s, Java-s ja JavaScriptis saadaolevast operaatorist "switch" pakuvad "match"-põhised avaldised palju rohkem lai funktsionaalsus. Märgitakse, et pakutud operaatorid parandavad koodi loetavust, lihtsustavad suvaliste Pythoni objektide võrdlemist ja silumist ning suurendavad ka koodi usaldusväärsust tänu laiendamise võimalusele. staatiline tüübikontroll.

def http_error(status):
vaste olek:
juhtum 400:
tagasta "halb taotlus"
juhtum 401|403|404:
tagasta "Pole lubatud"
juhtum 418:
tagasta "ma olen teekann"
juhtum_:
tagasta "midagi muud"

Näiteks saate olemasolevate väärtuste alusel muutujate sidumiseks lahti pakkida objekte, kortereid, loendeid ja suvalisi jadasid. Lubatud on defineerida pesastatud malle, kasutada mallis täiendavaid "if" tingimusi, kasutada maske ("[x, y, *rest]"), võtme/väärtuse vastendusi (näiteks {"bandwidth": b, "latency" ”: l} "ribalaiuse" ja "latentsuse" väärtuste ja sõnastiku eraldamiseks, alammallide ekstraktimiseks (operaator ":="), kasutage mallis nimega konstante. Klassides on võimalik sobitamiskäitumist kohandada kasutades meetodit “__match__()”.

andmeklassidest impordi andmeklassi

@andmeklass
klassi punkt:
x:int
y:int

def whereis(punkt):
mängupunkt:
juhtumipunkt(0, 0):
print ("Päritolu")
juhtumipunkt(0, y):
print(f"Y={y}")
Juhtumi punkt(x, 0):
print(f"X={x}")
case Point():
print ("Kusagil mujal")
juhtum_:
print ("Pole mõtet")

mängupunkt:
juhtum Punkt(x, y), kui x == y:
print(f"Y=X kell {x}")
juhtumipunkt(x, y):
print(f"Ei ole diagonaalis")

PUNANE, ROHELINE, SININE = 0, 1, 2
sobitada värv:
ümbris .PUNANE:
print ("Ma näen punast!")
ümbris .ROHELINE:
print ("Rohi on roheline")
ümbris .BLU
E:
print("Ma tunnen bluusi :(")

Ülevaatamiseks on komplekt ette valmistatud plaastrid eksperimentaalsega rakendamine pakutud spetsifikatsioon, kuid lõplik versioon on alles arutati. Näiteks pakutud Vaikeväärtuse väljendi "case _:" asemel kasutage märksõna "else:" või "default:", kuna muudes kontekstides kasutatakse "_" ajutise muutujana. Küsitav on ka sisemine korraldus, mis põhineb uute avaldiste tõlkimisel baitkoodiks, mis sarnaneb konstruktsioonide "if ... elif ... else" puhul kasutatavaga, mis ei anna soovitud jõudlust väga suurte võrdluskomplektide töötlemisel.

Allikas: opennet.ru

Lisa kommentaar