Guido van Rossum pasiūlė pridėti šablonų atitikimo operatorius į Python

Guido van Rossum pristatė projektas bendruomenės peržiūrai specifikacijos modelio atitikimo operatoriams (atitikties ir didžiosios raidės) įdiegimui Python. Pažymėtina, kad pasiūlymai pridėti šablonų atitikimo operatorius jau buvo paskelbti 2001 ir 2006 m.pep-0275, pep-3103), tačiau buvo atmesti ir optimizuoti konstrukciją „if ... elif ... else“, kad būtų sudarytos atitikimo grandinės.

Naujasis diegimas labai panašus į „match“ operatorių, pateiktą „Scala“, „Rust“ ir „F#“, kuris lygina nurodytos išraiškos rezultatą su šablonų sąrašu, pateiktu blokais pagal „case“ operatorių. Skirtingai nuo C, Java ir JavaScript operatoriaus „switch“, „match“ pagrįstos išraiškos siūlo daug daugiau platus funkcionalumas. Pažymima, kad siūlomi operatoriai pagerins kodo skaitomumą, supaprastins savavališkų Python objektų palyginimą ir derinimą, taip pat padidins kodo patikimumą dėl galimybės išplėsti. statinis tipo patikrinimas.

def http_error(status):
rungtynių būsena:
400 atvejis:
grąžinti „Bloga užklausa“
atvejis 401|403|404:
grąžinti „Neleidžiama“
418 atvejis:
grąžinti "aš arbatinukas"
case_:
grąžinti "kažkas kita"

Pavyzdžiui, galite išpakuoti objektus, eilutes, sąrašus ir savavališkas sekas, kad susietumėte kintamuosius pagal esamas reikšmes. Leidžiama apibrėžti įdėtus šablonus, šablone naudoti papildomas „if“ sąlygas, naudoti kaukes („[x, y, *rest]“), rakto/reikšmių susiejimą (pvz., {"bandwidth": b, "latency" ”: l}, norėdami išgauti „pralaidumo“ ir „latencijos“ reikšmes ir žodyną, išskleisti antrinius šablonus („:=“ operatorius), šablone naudokite pavadintas konstantas. Klasėse galima pritaikyti atitikimo elgesį naudojant „__match__()“ metodą.

iš duomenų klasių importuoti duomenų klasę

@dataclass
klasės taškas:
x:int
y:int

def whereis (taškas):
rungtynių taškas:
Atvejo taškas (0, 0):
spausdinti („Kilmė“)
atvejo taškas (0, y):
spausdinti (f"Y={y}")
Atvejo taškas (x, 0):
spausdinti (f"X={x}")
atvejo taškas ():
spausdinti („Kažkur kitur“)
case_:
print ("Ne taškas")

rungtynių taškas:
atvejis Taškas(x, y), jei x == y:
print (f"Y=X at {x}")
atvejo taškas (x, y):
print (f "Ne įstrižainėje")

RAUDONA, ŽALIA, MĖLYNA = 0, 1, 2
atitikimo spalva:
dėklas .RED:
spausdinti ("Aš matau raudoną!")
dėklas .GREEN:
spausdinti („Žolė žalia“)
dėklas .BLU
E:
print("Aš jaučiu bliuzą :(")

Paruoštas rinkinys peržiūrai pleistrai su eksperimentine įgyvendinimas pasiūlyta specifikacija, tačiau galutinė versija vis dar yra aptarta. Pavyzdžiui, pasiūlytas Vietoj išraiškos „case _:“ kaip numatytąją reikšmę naudokite raktinį žodį „else:“ arba „default:“, nes „_“ kituose kontekstuose naudojamas kaip laikinas kintamasis. Taip pat abejonių kelia vidinė organizacija, pagrįsta naujų išraiškų vertimu į baitinį kodą, panašų į naudojamą „if ... elif ... else“ konstrukcijoms, kuri nesuteiks norimo našumo apdorojant labai didelius palyginimų rinkinius.

Šaltinis: opennet.ru

Добавить комментарий