Guido van Rossum je predlagal dodajanje operatorjev za ujemanje vzorcev v Python

Guido van Rossum uveden osnutek za pregled skupnosti specifikacije za implementacijo operatorjev za ujemanje vzorcev (ujemanje in male črke) v Pythonu. Opozoriti je treba, da so bili predlogi za dodajanje operaterjev za ujemanje vzorcev objavljeni že v letih 2001 in 2006 (pep-0275, pep-3103), vendar so bili zavrnjeni v korist optimizacije konstrukta »if ... elif ... else« za sestavljanje ujemajočih se verig.

Nova izvedba je zelo podobna operatorju »ujemanja« v Scali, Rustu in F#, ki primerja rezultat določenega izraza s seznamom vzorcev, navedenih v blokih, na podlagi operatorja »case«. Za razliko od operatorja "switch", ki je na voljo v C, Javi in ​​JavaScriptu, izrazi, ki temeljijo na "ujemanju", ponujajo veliko več široka funkcionalnost. Opozoriti je treba, da bodo predlagani operaterji izboljšali berljivost kode, poenostavili primerjavo poljubnih objektov Python in odpravljanje napak ter povečali zanesljivost kode zaradi možnosti razširjenega statično preverjanje tipa.

def http_error(status):
stanje ujemanja:
primer 400:
vrni "Slaba zahteva"
primer 401|403|404:
vrni "Ni dovoljeno"
primer 418:
vrni "Jaz sem čajnik"
Ovitek_:
vrni "Nekaj ​​drugega"

Na primer, lahko razpakirate predmete, tuple, sezname in poljubna zaporedja, da povežete spremenljivke na podlagi obstoječih vrednosti. Dovoljeno je definirati ugnezdene predloge, uporabiti dodatne pogoje »če« v predlogi, uporabiti maske (»[x, y, *rest]«), preslikave ključ/vrednost (na primer {»pasovna širina«: b, »zakasnitev ”: l} za ekstrahiranje vrednosti in slovarja za "pasovno širino" in "zakasnitev", ekstrahiranje podpredlog (operator":="), uporaba imenovanih konstant v predlogi. V razredih je mogoče prilagoditi vedenje ujemanja z uporabo metode »__match__()«.

iz podatkovnih razredov uvozi podatkovni razred

@dataclass
točka razreda:
x:int
y:int

def whereis(točka):
točka srečanja:
case Point(0, 0):
print("Izvor")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
natisni(f"X={x}")
case Point():
print("Nekje drugje")
Ovitek_:
print("Ni točka")

točka srečanja:
case Point(x, y), če je x == y:
print(f"Y=X pri {x}")
Case Point(x, y):
print(f"Ne na diagonali")

RDEČA, ZELENA, MODRA = 0, 1, 2
ujemaj barvo:
etui .RED:
print("Vidim rdeče!")
ohišje .ZELENO:
print("Trava je zelena")
etui .BLU
E:
print(“Čutim blues :(“)

Za pregled je pripravljen komplet obliži z eksperimentalnimi izvajanje predlagana specifikacija, vendar je končna različica še vedno razpravljali. Na primer ponujen Namesto izraza "case _:" za privzeto vrednost uporabite ključno besedo "else:" ali "default:", saj se "_" v drugih kontekstih uporablja kot začasna spremenljivka. Vprašljiva je tudi notranja organizacija, ki temelji na prevajanju novih izrazov v bajtno kodo, podobno tisti, ki se uporablja za konstrukcije »if ... elif ... else«, kar ne bo zagotovilo želene zmogljivosti pri obdelavi zelo velikih nizov primerjav.

Vir: opennet.ru

Dodaj komentar