Guido van Rossum navrhol pridanie operátorov zhody vzorov do Pythonu

Guido van Rossum predložené návrh na komunitnú kontrolu technické údaje na implementáciu operátorov zhody vzorov (zhoda a veľkosť písmen) v Pythone. Treba poznamenať, že návrhy na pridanie operátorov zhody vzorov už boli zverejnené v rokoch 2001 a 2006 (pep-0275, pep-3103), ale boli zamietnuté v prospech optimalizácie konštruktu „ak ... elif ... else“ na zostavovanie zodpovedajúcich reťazcov.

Nová implementácia je veľmi podobná operátoru "match" poskytovanému v Scala, Rust a F#, ktorý porovnáva výsledok zadaného výrazu so zoznamom vzorov uvedených v blokoch na základe operátora "case". Na rozdiel od operátora „switch“ dostupného v jazykoch C, Java a JavaScript, výrazy založené na „zhode“ ponúkajú oveľa viac široká funkčnosť. Je potrebné poznamenať, že navrhované operátory zlepšia čitateľnosť kódu, zjednodušia porovnávanie ľubovoľných objektov Pythonu a ladenia a tiež zvýšia spoľahlivosť kódu vďaka možnosti rozšírenia statická kontrola typu.

def http_error(stav):
stav zápasu:
prípad 400:
vrátiť "zlá požiadavka"
prípad 401|403|404:
vrátiť "Nie je povolené"
prípad 418:
návrat "som čajník"
prípad_:
vrátiť "niečo iné"

Môžete napríklad rozbaliť objekty, n-tice, zoznamy a ľubovoľné sekvencie a naviazať premenné na základe existujúcich hodnôt. Je povolené definovať vnorené šablóny, používať ďalšie podmienky „if“ v šablóne, používať masky („[x, y, *rest]“), mapovania kľúč/hodnota (napríklad {„šírka pásma“: b, „latencia ”: l} na extrahovanie hodnôt "šírky pásma" a "latencie" a slovníka, extrahovanie podšablón (operátor ":="), použitie pomenovaných konštánt v šablóne. V triedach je možné prispôsobiť správanie zhody pomocou metódy „__match__()“.

z dataclasses importovať dataclass

@dataclass
bod triedy:
x:int
y:int

def whereis(bod):
bod za zápas:
case Point(0, 0):
vytlačiť ("Pôvod")
case Point(0, y):
print(f"Y={y}")
bod prípadu (x, 0):
print(f"X={x}")
bod prípadu():
vytlačiť ("Niekde inde")
prípad_:
vytlačiť ("To nie je bod")

bod za zápas:
case Point(x, y) ak x == y:
print(f"Y=X pri {x}")
bod prípadu (x, y):
print(f"Nie na diagonále")

ČERVENÁ, ZELENÁ, MODRÁ = 0, 1, 2
zodpovedať farbe:
puzdro .RED:
vytlačiť ("Vidím červené!")
puzdro .GREEN:
tlač ("tráva je zelená")
puzdro .BLU
E:
tlač („Cítim blues :(“)

Súprava bola pripravená na kontrolu náplasti s experimentálnym implementáciu navrhovaná špecifikácia, ale konečná verzia je stále k dispozícii diskutované, Napríklad ponúkol Namiesto výrazu "case _:" pre predvolenú hodnotu použite kľúčové slovo "else:" alebo "default:", pretože "_" sa v iných kontextoch používa ako dočasná premenná. Otázna je aj vnútorná organizácia, ktorá je založená na prekladaní nových výrazov do bajtkódu podobného tomu, ktorý sa používa pri konštrukciách „if ... elif ... else“, ktoré neposkytujú požadovaný výkon pri spracovaní veľmi veľkých sád porovnaní.

Zdroj: opennet.ru

Pridať komentár