Guido van Rossum a propus adăugarea operatorilor de potrivire a modelelor la Python

Guido van Rossum a prezentat proiect pentru evaluarea comunității specificații pentru implementarea operatorilor de potrivire a modelelor (potrivire și majuscule) în Python. Trebuie remarcat faptul că propunerile de adăugare a operatorilor de potrivire a modelelor au fost deja publicate în 2001 și 2006 (pep-0275, pep-3103), dar au fost respinse în favoarea optimizării constructului „dacă ... elif ... altfel” pentru compilarea lanțurilor de potrivire.

Noua implementare seamănă mult cu operatorul „potrivire” furnizat în Scala, Rust și F#, care compară rezultatul unei expresii specificate cu o listă de modele listate în blocuri bazate pe operatorul „caz”. Spre deosebire de operatorul „comutator” disponibil în C, Java și JavaScript, expresiile bazate pe „potrivire” oferă mult mai multe funcționalitate largă. Se observă că operatorii propuși vor îmbunătăți lizibilitatea codului, vor simplifica compararea obiectelor Python arbitrare și depanarea și, de asemenea, vor crește fiabilitatea codului datorită posibilității extinderii. verificarea tipului static.

def http_error(stare):
starea meciului:
caz 400:
returnează „Cerere greșită”
cazul 401|403|404:
returnează „Nu este permis”
caz 418:
returnează „Sunt un ceainic”
caz_:
returnează „Altceva”

De exemplu, puteți despacheta obiecte, tupluri, liste și secvențe arbitrare pentru a lega variabile pe baza valorilor existente. Este permisă definirea șabloanelor imbricate, utilizarea condițiilor suplimentare „dacă” în șablon, utilizarea măștilor („[x, y, *rest]”), mapări cheie/valoare (de exemplu, {„bandwidth”: b, „latency” ”: l} pentru a extrage valorile „lățime de bandă” și „latență” și dicționar), extrageți subșabloane ("operator:="), utilizați constante numite în șablon. În clase, este posibil să personalizați comportamentul de potrivire folosind metoda „__match__()”.

din clasele de date importați clasa de date

@dataclass
Punct de clasa:
x:int
y:int

def whereis(punct):
Punct de meci:
caz Punct(0, 0):
print("Origine")
caz Punct(0, y):
print(f"Y={y}")
caz Punct(x, 0):
print(f"X={x}")
case Point():
print("Undeva altundeva")
caz_:
print("Nu este un punct")

Punct de meci:
caz Punct(x, y) dacă x == y:
print(f"Y=X la {x}")
caz Punct(x, y):
print(f"Nu pe diagonală")

ROȘU, VERDE, ALBASTRU = 0, 1, 2
se potrivește cu culoarea:
caz .RED:
print("Văd roșu!")
caz .VERDE:
print("Iarba este verde")
caz .BLU
E:
print(„Simt blues :(“)

Un set a fost pregătit pentru revizuire petice cu experimental implementare specificația propusă, dar versiunea finală este încă discutat. De exemplu a oferit În loc de expresia „case _:” pentru valoarea implicită, utilizați cuvântul cheie „else:” sau „default:”, deoarece „_” în alte contexte este folosit ca variabilă temporară. De asemenea, este discutabilă și organizarea internă, care se bazează pe traducerea noilor expresii în bytecode similar cu cel folosit pentru constructele „if ... elif ... else”, care nu va oferi performanța dorită atunci când procesează seturi foarte mari de comparații.

Sursa: opennet.ru

Adauga un comentariu