4 moćne značajke Python još uvijek nedostaje

Python je živi jezik - u stalnom se razvoju kako bi išao u korak s vremenom. Python Software Foundation ne dodaje samo standardnu ​​knjižnicu i referentnu implementaciju CPython, već uvodi nove značajke i usavršavanja u sam jezik.

Na primjer, Python 3.8 uveo je novu sintaksu za redne dodjele ("operater morža") koja pojedine operacije čini sažetijima. Još jedno novo odobreno poboljšanje sintakse, podudaranje uzoraka, olakšat će pisanje koda koji procjenjuje jedan od mnogih mogućih slučajeva. Obje ove značajke nadahnute su njihovom prisutnošću i korisnošću na drugim jezicima.

I to su samo dvije korisne značajke koje se mogu dodati Pythonu kako bi jezik učinio izražajnijim, snažnijim i prikladnijim suvremenom programskom svijetu. Što bismo još mogli poželjeti? Evo još četiri jezične značajke koje bi Pythonu mogle dodati nešto od stvarne vrijednosti - dvije bismo zapravo mogli dobiti, a dvije vjerojatno nećemo. 

Istinske konstante

Python zapravo nema koncept konstantne vrijednosti. Danas su konstante u Pythonu uglavnom stvar dogovora. Upotreba imena u velikim i velikim slovima - npr. DO_NOT_RESTART - nagovještaj je da je varijabla namijenjena konstanti. Slično tome, typing.Final napomena o  tipu daje linkove linterima da objekt ne treba mijenjati, ali to ne provodi tijekom izvođenja.

Zašto? Budući da je promjenjivost duboko usađena u Pythonovo ponašanje. Kada varijabli dodijelite vrijednost - npr.,  x=3 - stvarate ime u lokalnom prostoru imena  xi usmjeravate ga na objekt u sustavu koji ima cijelu vrijednost  3. Python u svakom trenutku pretpostavlja da su imena promjenjiva - da bi bilo koje ime moglo ukazivati ​​na bilo koji objekt. To znači da se Python svaki put kada se koristi neko ime trudi potražiti na koji objekt pokazuje. Ova dinamičnost jedan je od glavnih razloga zbog kojih Python radi sporije od nekih drugih jezika. Pythonova dinamičnost nudi veliku fleksibilnost i praktičnost, ali dolazi po cijenu izvedbe.

Jedna od prednosti postojanja istinskih konstantnih deklaracija u Pythonu bilo bi neko smanjenje učestalosti pretraživanja objekata koje se odvijaju tijekom izvođenja, a time i bolja izvedba. Ako vrijeme izvođenja unaprijed zna da se zadana vrijednost nikad ne mijenja, ne mora tražiti svoje veze. To bi također moglo pružiti put za daljnju optimizaciju trećih strana, poput sustava koji generiraju izvorni kod iz Python aplikacija (Cython, Nuitka).

Međutim, istinske konstante bile bi velika promjena i najvjerojatnije unatrag nespojiva promjena. Također bi bilo za raspravu bi li konstante dolazile putem nove sintakse - na primjer, još uvijek neiskorištenog  $ simbola - ili kao produžetak postojećeg Pythonovog načina deklariranja imena. Konačno, tu je i šire, filozofsko pitanje imaju li smisla istinske konstante u jeziku u kojem je dinamičnost velik dio privlačnosti.

Ukratko, moguće je da ćemo u Pythonu vidjeti prave konstante, ali to bi bila velika prijelomna promjena.

Istinsko preopterećenje i generički lijekovi

Na mnogim se jezicima može napisati više verzija iste funkcije za rad s različitim vrstama unosa. Na primjer,  to_string() funkcija može imati različite implementacije za pretvorbu iz cijelih brojeva, brojeva s pomičnom zarezom ili drugih objekata - ali oni će dijeliti isto ime radi praktičnosti. "Preopterećenje" ili "generički" olakšavaju pisanje robusnog softvera jer generičke metode možete pisati za uobičajene procese, a ne koristiti metode specifično za određeni tip.

Python vam omogućuje da pomoću jednog imena funkcije radite na mnogima, ali ne definiranjem višestrukih primjeraka funkcije. Možete definirati ime samo jednom u zadanom opsegu i istovremeno ga vezati za samo jedan objekt, tako da ne možete imati više verzija jedne funkcije pod istim imenom.

Ono što programeri Python obično rade da bi to zaobišli jest upotreba ugrađenih ugrađenih   elemenata isinstance() ili  type()utvrđivanje vrste varijable koja je poslana funkciji, a zatim poduzimanje radnji na temelju vrste. Ponekad to uključuje slanje na specifičnu verziju funkcije ispod haube. Ali ovaj pristup otežava drugim programerima da prošire vašu funkciju, osim ako se ne potrudite da je učinite proširivom - na primjer, slanjem na metode unutar klase, koje bi mogle biti podrazvrstane.

PEP 3124, napredan u travnju 2007., predložio je mehanizam za ukrašavanje funkcija koji ukazuje da bi mogle biti preopterećene. Prijedlog je odgođen umjesto da je izravno odbijen - što znači da je ideja u osnovi bila valjana, ali nije bilo pravo vrijeme za njezinu provedbu. Jedan od čimbenika koji bi mogao ubrzati usvajanje preopterećenja u Pythonu - ili uzrokovati potpuno odbacivanje ideje - je implementacija novopredloženog sustava za podudaranje uzoraka.

U teoriji, podudaranje uzorka moglo bi se koristiti ispod haube za upravljanje slanjem preopterećenja. Međutim, uzorak podudaranja mogle dati kao razlog za ne provođenje generičkih lijekova u Python, budući da je već pruža elegantan način otpreme operacija na temelju vrste potpisa.

Tako bismo jednog dana mogli dobiti istinsko preopterećenje u Pythonu ili bi njegove prednosti mogli zamijeniti drugi mehanizmi.

Optimizacije rekurzije repa

Mnogi kompajleri jezika koriste optimizaciju rekurzije repa, gdje funkcije koje se same nazivaju ne stvaraju nove okvire stoga u aplikaciji, a time i riskiraju miniranje stoga ako predugo rade. Python to ne čini, a zapravo su se njegovi tvorci stalno suprotstavljali tome.

Jedan od razloga je taj što velik dio Pythona, iznutra prema van, koristi  iteraciju,  a ne  rekurziju  - generatore, koroutine i tako dalje. U ovom slučaju to znači korištenje funkcije s petljom i strukturom steka umjesto rekurzivnog mehanizma. Svaki poziv petlje može se spremiti u stog kako bi se stvorila nova rekurzija i iskočiti iz steka kad se rekurzija završi.

Programeri Pythona potiču se da koriste ove uzorke umjesto rekurzije, pa se čini malo nade za optimizaciju rekurzije. Ovdje šanse uopće nisu vjerojatne, jer Pythonovi idiomi podržavaju druga rješenja.

Višeredne lambde

Lambda, ili anonimne funkcije, ušle su u Python tek nakon određenog otpora tvorca jezika Guida van Rossuma. Kako Python lambda sada postoji, vrlo su ograničene: omogućuju vam upotrebu samo jednog izraza (u osnovi, bilo čega s desne strane znaka jednakosti u operaciji dodjele) kao tijela funkcije. Ako želite puni blok izjava, samo ih razdvojite i od njih napravite stvarnu funkciju.

Razlog se svodi na dizajn jezika kakav ga vidi van Rossum. Kao što je van Rossum napisao 2006. godine, „Smatram   neprihvatljivim svako rješenje koje ugrađuje blok temeljen na uvlačenju u sredinu izraza. Budući da smatram da je alternativna sintaksa za grupiranje izjava (npr. Zagrade ili ključne riječi početak / kraj) podjednako neprihvatljiva, ovo višestruko čini lambdu nerješivom zagonetkom. "

Drugim riječima, problem nije tehnički, već nedostatak sintakse za višeredne lambde koja nadopunjuje postojeću estetiku Python sintakse. Vjerojatno ne postoji način koji to ne uključuje stvaranje posebnog slučaja, a jezik koji prikuplja posebne slučajeve postaje neugodan za upotrebu. Dok se takav jednorog ne pojavi, morat ćemo se zadovoljiti odvojeno definiranim funkcijama.

Višeredne lambde se vjerojatno ne događaju u Pythonu.

Pročitajte više o Pythonu:

  • Python 3.9: Što je novo i bolje
  • Najbolje nove značajke u Pythonu 3.8
  • Bolje upravljanje Python projektima s poezijom
  • Virtualenv i venv: Objašnjena Python virtualna okruženja
  • Python virtualenv i venv čine i ne čine
  • Objašnjeni Python navoji i potprocesi
  • Kako se koristi Python program za ispravljanje pogrešaka
  • Kako koristiti timeit za profiliranje Python koda
  • Kako koristiti cProfile za profiliranje Python koda
  • Započnite s async u Pythonu
  • Kako koristiti asyncio u Pythonu
  • Kako pretvoriti Python u JavaScript (i natrag)
  • Python 2 EOL: Kako preživjeti kraj Pythona 2
  • 12 Pythona za svaku programsku potrebu
  • 24 Python biblioteke za svakog programera Pythona
  • 7 slatkih IDE-a za Python koje ste možda propustili
  • 3 glavna nedostatka Pythona - i njihova rješenja
  • 13 uspoređenih Python web okvira
  • 4 Python test okvira za uništavanje bugova
  • 6 sjajnih novih Python značajki koje ne želite propustiti
  • 5 Python distribucija za svladavanje strojnog učenja
  • 8 sjajnih Python knjižnica za obradu prirodnog jezika
  • 6 Python knjižnica za paralelnu obradu
  • Što je PyPy? Brži Python bez boli
  • Što je Cython? Python brzinom C