Programovanie

4 výkonné funkcie Python stále chýba

Python je živý jazyk - neustále sa vyvíjajúci, aby držal krok s dobou. Softvérová nadácia Python nielen rozširuje štandardnú knižnicu a referenčnú implementáciu CPython, ale zavádza aj nové funkcie a vylepšenia samotného jazyka.

Napríklad Python 3.8 zaviedol novú syntax pre in-line priradenia („operátor mrože“), ktorá robí niektoré operácie stručnejšími. Ďalšie novo schválené vylepšenie syntaxe, porovnávanie vzorov, uľahčí písanie kódu, ktorý sa vyhodnocuje pre jeden z mnohých možných prípadov. Obe tieto funkcie boli inšpirované ich prítomnosťou a užitočnosťou v iných jazykoch.

A sú to iba dve z množstva užitočných funkcií, ktoré je možné do Pythonu pridať, aby bol jazyk expresívnejší, výkonnejší a vhodnejší pre moderný programovací svet. Čo iné si môžeme priať? Tu sú ďalšie štyri jazykové funkcie, ktoré by mohli Pythonu pridať niečo so skutočnou hodnotou - dve, ktoré skutočne môžeme získať, a dve, ktoré pravdepodobne nebudeme.

Skutočné konštanty

Python v skutočnosti nemá koncept konštantnej hodnoty. Dnes sú konštanty v Pythone väčšinou vecou konvencie. Používanie mena s veľkými písmenami a v prípade hada - napr. DO_NOT_RESTART - je náznak, že premenná má byť konštantná. Podobnepísanie na konci anotácia typu poskytuje náznakom linterov, že objekt by nemal byť upravovaný, ale za behu to nevynucuje.

Prečo? Pretože premenlivosť je hlboko zakorenená v správaní Pythonu. Keď premennej priradíte hodnotu - napr.x = 3 - vytvárate meno v miestnom mennom priestore,Xa nasmerovanie na objekt v systéme, ktorý má celočíselnú hodnotu3. Python vždy predpokladá, že názvy sú premenlivé - to akýkoľvek meno by mohlo ukazovať na akýkoľvek objekt. To znamená, že zakaždým, keď sa meno použije, Python má problémy s hľadaním toho, na aký objekt ukazuje. Táto dynamika je jedným z hlavných dôvodov, prečo Python beží pomalšie ako niektoré iné jazyky. Dynamika jazyka Python ponúka veľkú flexibilitu a pohodlie, ale stojí to za cenu výkonu za behu.

Jednou z výhod skutočných konštantných deklarácií v Pythone by bolo určité zníženie frekvencie vyhľadávaní objektov, ktoré sa uskutočňujú počas behu programu, a tým lepší výkon. Ak runtime vopred vie, že sa daná hodnota nikdy nezmení, nemusí vyhľadávať svoje väzby. To by tiež mohlo poskytnúť cestu k ďalším optimalizáciám tretích strán, ako sú systémy, ktoré generujú strojovo natívny kód z aplikácií Pythonu (Cython, Nuitka).

Skutočné konštanty by však boli zásadnou zmenou a pravdepodobne spätne nekompatibilnou zmenou. Bolo by tiež na diskusiu, či by konštanty prichádzali prostredníctvom novej syntaxe - napríklad zatiaľ nevyužité$ symbol - alebo ako rozšírenie existujúceho spôsobu Pythonu na deklarovanie mien. Na záver je tu rozsiahlejšia filozofická otázka, či majú skutočné konštanty zmysel v jazyku, v ktorom je dynamika veľkou časťou odvolania.

Stručne povedané, je možné, že v Pythone uvidíme skutočné konštanty, ale bola by to veľká zlomová zmena.

Skutočné preťaženie a generiká

V mnohých jazykoch je možné napísať viac verzií tej istej funkcie, aby fungovali s rôznymi druhmi vstupu. Napríklad anatiahnuť() Táto funkcia môže mať rôzne implementácie na prevod z celých čísel, čísel s pohyblivou rádovou čiarkou alebo iných objektov - kvôli pohodliu by však zdieľali rovnaký názov. „Preťaženie“ alebo „generiká“ uľahčujú písanie robustného softvéru, pretože namiesto bežných metód pre daný typ môžete písať všeobecné metódy pre bežné procesy.

Python vám umožňuje používať jeden názov funkcie a robiť prácu mnohých, ale nie definovaním viacerých inštancií funkcie. V danom rozsahu môžete definovať názov iba raz a spojiť ho iba s jedným objektom súčasne, takže pod rovnakým názvom nemôžete mať viac verzií jednej funkcie.

To, čo vývojári Pythonu zvyčajne robia, aby to obišli, je použitie vstavaných prvkovisinstance () alebotyp () Ak chcete určiť typ premennej odoslanej funkcii, urobte akciu na základe typu. Niekedy to zahŕňa odoslanie funkcie pod kapotou na typovo špecifickú verziu funkcie. Ale tento prístup sťažuje ostatným vývojárom rozšírenie vašej funkcie, pokiaľ nevytvoríte spôsob, ako ju rozšíriť - napríklad dispečingom s metódami v triede, ktoré by sa dali podtriediť.

PEP 3124, pokročilý v apríli 2007, navrhol mechanizmus zdobenia funkcií, ktorý naznačuje, že by mohli byť preťažené. Návrh bol skôr odložený, než aby bol priamo odmietnutý - to znamená, že myšlienka bola v zásade správna, ale nebol vhodný čas na jej implementáciu. Jedným z faktorov, ktoré by mohli urýchliť prijatie preťaženia v Pythone - alebo spôsobiť úplné zbavenie sa myšlienky - je implementácia novo navrhovaného systému porovnávania vzorov.

Teoreticky by sa pod kapotou mohlo použiť zosúladenie vzorov na zvládnutie odosielania preťaženia. Zhoda vzorov by sa však mohla uviesť aj ako zdôvodnenie nie implementácia generík v Pythone, pretože už poskytuje elegantný spôsob odosielania operácií na základe podpisov typov.

Takže jedného dňa by sme mohli v Pythone skutočne preťažiť, alebo by jeho výhody mohli nahradiť iné mechanizmy.

Optimalizácia rekurzie chvosta

Mnoho prekladačov jazykov využíva optimalizácie rekurzie chvosta, keď funkcie, ktoré si hovoria, nevytvárajú v aplikácii nové rámce zásobníka, a tak riskujú vyhodenie zásobníka do vzduchu, ak budú bežať príliš dlho. Python to nerobí a jeho tvorcovia v skutočnosti neustále vystupujú proti tomu.

Jedným z dôvodov je to, že veľká časť Pythonu sa používa zvnútraiterácia radšej nežrekurzia - generátory, korutíny atď. V tomto prípade to znamená namiesto rekurzívneho mechanizmu použiť funkciu so slučkou a štruktúrou zásobníka. Každé volanie slučky je možné uložiť do zásobníka, aby sa vytvorila nová rekurzia, a po dokončení rekurzie sa zo zásobníka vysunie.

Vývojárom Pythonu sa odporúča používať tieto vzory namiesto rekurzie, takže sa zdá, že existuje malá nádej na optimalizáciu rekurzie. Šance tu nie sú vôbec pravdepodobné, pretože Pythonove idiómy podporujú ďalšie riešenia.

Viacriadkové lambdy

Lambdas alebo anonymné funkcie sa do Pythonu dostali až po určitom odpore tvorcu jazyka Guida van Rossuma. Keďže teraz existujú lambdy Pythonu, sú veľmi obmedzené: ako telo funkcie vám umožňujú použiť iba jeden výraz (v podstate čokoľvek napravo od znamienka rovnosti v operácii priradenia). Ak chcete celý blok výpisov, jednoducho ich rozdeľte a urobte z nich skutočnú funkciu.

Dôvod spočíva v dizajne jazyka, ako ho vidí van Rossum. Ako napísal van Rossum v roku 2006: „Nájdemakýkoľvek neprijateľné riešenie, ktoré do bloku výrazu vloží blok založený na odsadení. Pretože považujem alternatívnu syntax pre zoskupovanie príkazov (napr. Zložené zátvorky alebo začiatočné a koncové kľúčové slová) za rovnako neprijateľnú, robí z viacriadkovej lambdy neriešiteľnú hádanku. “

Inými slovami, problém nie je technický, ale nedostatok syntaxe pre viacriadkové lambdas, ktorá by dopĺňala existujúcu estetiku syntaxe Pythonu. Pravdepodobne neexistuje spôsob, ako to urobiť, ktorý nezahŕňa vytvorenie špeciálneho prípadu, a jazyk, v ktorom sa hromadia špeciálne prípady, sa zvyčajne stáva nepríjemným. Kým sa taký jednorožec objaví, budeme si musieť vystačiť s osobitne definovanými funkciami.

Viacriadkové lambdy sa v Pythone pravdepodobne nedejú.

Prečítajte si viac o Pythone:

  • Python 3.9: Čo je nové a lepšie
  • Najlepšie nové funkcie v Pythone 3.8
  • Lepšie riadenie projektov v Pythone s Poetry
  • Virtualenv a venv: Vysvetlenie virtuálnych prostredí Pythonu
  • Python virtualenv a venv robí a nerobí
  • Vysvetlenie vlákien a podprocesov v jazyku Python
  • Ako používať debugger Pythonu
  • Ako používať timeit na profilovanie kódu Pythonu
  • Ako používať cProfile na profilovanie kódu Pythonu
  • Začnite s asynchronizáciou v Pythone
  • Ako používať asyncio v Pythone
  • Ako previesť Python na JavaScript (a späť)
  • Python 2 EOL: Ako prežiť koniec Pythonu 2
  • 12 pytónov pre každú potrebu programovania
  • 24 knižníc Pythonu pre každého vývojára Pythonu
  • Sedem sladkých IDE Pythonu, ktoré vám mohli chýbať
  • 3 hlavné nedostatky Pythonu - a ich riešenia
  • 13 porovnávaných webových rámcov Pythonu
  • 4 testovacie rámce Pythonu na rozdrvenie vašich chýb
  • 6 skvelých nových funkcií Pythonu, ktoré vám určite nebudú chýbať
  • 5 distribúcií Pythonu na zvládnutie strojového učenia
  • 8 skvelých knižníc Pythonu na spracovanie prirodzeného jazyka
  • 6 knižníc Pythonu na paralelné spracovanie
  • Čo je to PyPy? Rýchlejší Python bez bolesti
  • Čo je to Cython? Python rýchlosťou C
$config[zx-auto] not found$config[zx-overlay] not found