Programovanie

Python môže získať syntax zhody vzorov

Tvorcovia jazyka Python pripravujú nový návrh PEP 622, ktorý by konečne priniesol do jazyka Python syntax príkazu na porovnávanie vzorov. Nové príkazy na porovnávanie vzorov by poskytli programátorom Pythonu expresívnejšie spôsoby narábania so štruktúrovanými údajmi bez toho, aby sa museli uchýliť k alternatívnym riešeniam.

Priraďovanie vzorov je bežnou vlastnosťou mnohých programovacích jazykov, ako napr vypínač / puzdro v C. Umožňuje vykonať jednu z mnohých možných akcií na základe hodnoty danej premennej alebo výrazu. Aj keď Pythonu chýbala natívna syntax pre porovnávanie vzorov, bolo možné ho emulovaťak / elif / inak reťaze alebo vyhľadávanie v slovníku.

PEP 622 navrhuje metódu na porovnanie výrazu s množstvom druhov vzorov pomocou a zápas / prípad syntax:

zhoda niečo: prípad 0 | 1 | 2: veľké [[malé číslo]] písmeno [] | [_]: print ("Krátka sekvencia") case str () | bytes (): print ("Niečo podobné reťazcu") case _: print ("Niečo iné")

Medzi podporované typy zhody vzorov patria literály, názvy, konštantné hodnoty, sekvencie, mapovanie (v zásade prítomnosť páru kľúč - hodnota vo výraze), trieda, kombinácia vyššie uvedeného alebo akýkoľvek z týchto plus podmienené výrazy. Akékoľvek zhody, ktoré sú nejednoznačné alebo je nemožné ich vyriešiť, vyvolajú za behu výnimku.

Objekty môžu zvládnuť testy zhody pomocou nového protokolu s názvom __zápas__ protokol. Ak objekt implementuje __zápas__ metódu, možno ju použiť na otestovanie, či sa zhoduje s daným vzorom triedy, a na návrat príslušnej odpovede.

PEP 622 by tiež umožnil kontrolám statického typu overiť, či je možné overiť zhody. Nový @ zapečatené dekorátor pre triedu označuje, že dáva typovej kontrole, že akákoľvek podtrieda príslušnej triedy je definovaná v rovnakom module ako základná trieda.

Predchádzajúce PEP na pridanie zhody vzorov - PEP 275 a PEP 3103, ktoré boli navrhnuté v rokoch 2001 a 2006, boli odmietnuté z dôvodu nedostatku podpory verejnosti. PEP 3103 navrhol tvorca Pythonu Guido van Rossum. Nový PEP, ktorého autorom je van Rossum a niekoľko ďalších, má za cieľ poskytnúť regulárne výrazy na porovnávanie objektov, a nie iba jednoduchý ak / elif / inak náhradný. Autori poznamenávajú, že veľa aspektov tohto PEP bolo inšpirovaných tým, ako funguje porovnávanie vzorov v Rust a Scala.

O tom, ako by sa to všetko mohlo implementovať pod kapotou, ešte len diskutuje. Implementácia navrhnutá v PEP 622 by generovala rovnaké sekvencie bajtových kódov ako ak / elif / inak reťaz. Väčšie vypínač / puzdro bloky sa mohli stať menej výkonnými v závislosti od toho, koľko podmienenej logiky bolo súčasťou každého z nich prípade. Avšak PEP objasňuje, že na stole je stále ľubovoľný počet prístupov a optimalizácií výkonu (napr. Memoizácia).

Aj keby bol PEP prijatý, mohlo by sa toho veľa zmeniť. Jednou z otázok, ktorá bude pravdepodobne napadnutá, je použitie prípad _: namiesto inak: ako posledná dohovorová klauzula preprepínač vyhlásenie._ sa v mnohých kontextoch používa ako dočasná premenná a prepísanie jej správania jednostranne môže byť pre vývojárov odbočkou.

$config[zx-auto] not found$config[zx-overlay] not found