Guido van Rossum navrhl přidání operátorů pro porovnávání vzorů do Pythonu

Guido van Rossum představen návrh ke komunitní kontrole Specifikace pro implementaci operátorů porovnávání vzorů (match a case) v Pythonu. Je třeba poznamenat, že návrhy na přidání operátorů shody vzorů již byly zveřejněny v letech 2001 a 2006 (pep-0275, pep-3103), ale byly odmítnuty ve prospěch optimalizace konstruktu „if ... elif ... else“ pro kompilaci odpovídajících řetězců.

Nová implementace je podobná operátoru "match" poskytovanému v Scala, Rust a F#, který porovnává výsledek zadaného výrazu se seznamem vzorů uvedených v blocích na základě operátoru "case". Na rozdíl od operátoru „switch“ dostupného v jazycích C, Java a JavaScript nabízejí výrazy založené na „match“ mnohem více široká funkčnost. Je třeba poznamenat, že navrhované operátory zlepší čitelnost kódu, zjednoduší porovnávání libovolných objektů Pythonu a ladění a také zvýší spolehlivost kódu díky možnosti rozšířeného statická kontrola typu.

def http_error(stav):
stav zápasu:
případ 400:
vrátit "Špatný požadavek"
případ 401|403|404:
vrátit "Není povoleno"
případ 418:
návrat "Jsem čajník"
pouzdro_:
vrátit "něco jiného"

Můžete například rozbalit objekty, n-tice, seznamy a libovolné sekvence a svázat proměnné na základě existujících hodnot. Je povoleno definovat vnořené šablony, používat další podmínky „if“ v šabloně, používat masky („[x, y, *rest]“), mapování klíč/hodnota (například {„šířka pásma“: b, „latence ”: l} pro extrahování hodnot "šířky pásma" a "latence" ​​a slovníku, extrahování podšablon (operátor ":="), použití pojmenovaných konstant v šabloně. Ve třídách je možné přizpůsobit chování shody pomocí metody „__match__()“.

z datových tříd importovat datovou třídu

@dataclass
bod třídy:
x:int
y:int

def whereis(bod):
zápasový bod:
případový bod(0, 0):
tisk ("původ")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
print(f"X={x}")
případový bod():
tisk ("Někde jinde")
pouzdro_:
tisknout ("To není bod")

zápasový bod:
case Point(x, y) if x == y:
print(f"Y=X v {x}")
případ Point(x, y):
print(f"Ne na diagonále")

ČERVENÁ, ZELENÁ, MODRÁ = 0, 1, 2
odpovídat barvě:
pouzdro .RED:
tisk ("Vidím červeně!")
pouzdro .ZELENÁ:
tisk ("tráva je zelená")
pouzdro .BLU
E:
tisk („Cítím blues :(“)

Sada byla připravena ke kontrole náplasti s experimentálním implementace navrhovaná specifikace, ale konečná verze je stále k dispozici diskutováno. Například, nabídl Místo výrazu "case _:" pro výchozí hodnotu použijte klíčové slovo "else:" nebo "default:", protože "_" se v jiných kontextech používá jako dočasná proměnná. Otázkou je také vnitřní organizace, která je založena na překladu nových výrazů do bajtového kódu podobného tomu, který se používá pro konstrukce „if ... elif ... else“, což neposkytne požadovaný výkon při zpracování velmi rozsáhlých sad srovnání.

Zdroj: opennet.ru

Přidat komentář