Ohjelmointi

4 tehokasta ominaisuutta Python puuttuu edelleen

Python on elävä kieli, jota kehitetään jatkuvasti ajan tasalla pysymiseksi. Python Software Foundation ei vain tee lisäyksiä vakiokirjastoon ja viitetoteutus CPythoniin, vaan tuo myös uusia ominaisuuksia ja parannuksia itse kieleen.

Esimerkiksi Python 3.8 otti käyttöön uuden syntaksin linjatoiminnoille ("mursuoperaattori"), joka tekee tietyistä toiminnoista suppeamman. Toinen äskettäin hyväksytty syntaksiparannus, mallien sovitus, helpottaa koodin kirjoittamista, joka arvioi yhtä monista mahdollisista tapauksista. Molemmat ominaisuudet innoittivat niiden läsnäolo ja hyödyllisyys muilla kielillä.

Ja ne ovat vain kaksi joukkoa hyödyllisiä ominaisuuksia, jotka voitaisiin lisätä Pythoniin, jotta kielestä tulisi ilmeikkäämpi, tehokkaampi ja sopivampi nykyaikaiseen ohjelmointimaailmaan. Mitä muuta voimme toivoa? Tässä on vielä neljä kieliominaisuutta, jotka voisivat lisätä Pythoniin jotain todellista arvoa - kaksi saatamme todella saada ja kaksi emme todennäköisesti.

Todelliset vakiot

Pythonilla ei oikeastaan ​​ole vakioarvon käsitettä. Nykyään Pythonin vakiot ovat enimmäkseen yleissopimus. Käyttämällä nimeä, joka on isoissa kirjaimissa ja käärmeissä - esim. DO_NOT_RESTART - on vihje siitä, että muuttujan on tarkoitus olla vakio. Samoinkirjoittaminen. lopullinen type-merkintä antaa vihjeen nukkuille, että objektia ei pitäisi muokata, mutta se ei pakota sitä ajon aikana.

Miksi? Koska muuntuvuus on syvään juurtunut Pythonin käyttäytymiseen. Kun määrität muuttujalle arvon, esim.x = 3 - luot nimen paikallisessa nimiavaruudessa,xja osoittamalla sen järjestelmässä olevaan objektiin, jolla on kokonaisluku3. Python olettaa aina, että nimet ovat muutettavissa - se minkä tahansa nimi voi osoittaa minkä tahansa esine. Tämä tarkoittaa, että joka kerta kun nimeä käytetään, Python vaivautuu etsimään mitä objektia se osoittaa. Tämä dynaamisuus on yksi tärkeimmistä syistä, miksi Python toimii hitaammin kuin jotkut muut kielet. Pythonin dynaamisuus tarjoaa suurta joustavuutta ja mukavuutta, mutta se maksaa ajonaikaisen suorituskyvyn kustannuksella.

Yksi etu siitä, että Pythonissa on todelliset vakiomuotoiset ilmoitukset, olisi ajon aikana tapahtuvien objektihakujen taajuuden pieneneminen ja siten parempi suorituskyky. Jos ajoaika tietää etukäteen, että annettu arvo ei koskaan muutu, sen ei tarvitse etsiä sidoksiaan. Tämä voisi tarjota myös keinon muiden kolmansien osapuolten optimoinnille, kuten järjestelmille, jotka tuottavat konekielisen koodin Python-sovelluksista (Cython, Nuitka).

Todelliset vakiot olisivat kuitenkin merkittävä muutos ja todennäköisesti taaksepäin yhteensopimaton muutos. Olisi myös keskustelua, jos vakiot tulisivat uuden syntaksin muodossa - esimerkiksi vielä käyttämättömät$ symboli - tai laajennuksena Pythonin nykyiseen tapaan ilmoittaa nimiä. Lopuksi on suurempi, filosofinen kysymys siitä, onko todellisilla vakioilla merkitystä kielellä, jossa dynaamisuus on ollut suuri osa vetoomusta.

Lyhyesti sanottuna on mahdollista, että näemme todelliset vakiot Pythonissa, mutta se olisi merkittävä murtava muutos.

Todellinen ylikuormitus ja geneeriset lääkkeet

Monilla kielillä saman toiminnon useita versioita voidaan kirjoittaa toimimaan erityyppisten syötteiden kanssa. Esimerkiksi amerkkijono () funktiolla voi olla erilaisia ​​toteutuksia muunnettaessa kokonaisluvuista, liukulukuista tai muista objekteista - mutta niillä olisi sama nimi mukavuuden vuoksi. "Ylikuormitus" tai "yleinen" helpottavat vankan ohjelmiston kirjoittamista, koska voit kirjoittaa yleisiä menetelmiä tavallisille prosesseille sen sijaan, että käyttäisit menetelmää nimenomaan tietylle tyypille.

Python antaa sinun käyttää yhtä funktion nimeä monien tekemiseen, mutta ei määrittelemällä useita funktion esiintymiä. Voit määrittää nimen vain kerran tietyssä laajuudessa ja sitoa sen vain yhteen objektiin kerrallaan, joten yhdellä toiminnolla ei voi olla useita versioita samalla nimellä.

Se, mitä Python-kehittäjät yleensä tekevät kiertääkseen tämän, on käyttää sisäänrakennettuja tapojaisinstance () taityyppi() määritäksesi toiminnolle lähetetyn muuttujan tyypin, toimi sitten tyypin perusteella. Joskus tämä tarkoittaa lähettämistä hupun alla olevan toiminnon tyyppikohtaiseen versioon. Mutta tämä lähestymistapa vaikeuttaa muiden kehittäjien laajentamaan toimintoasi, ellet tee omaa tapaa tehdä siitä laajennettavissa - esimerkiksi siirtymällä luokan sisäisiin menetelmiin, jotka voidaan luokitella alaluokkiin.

Huhtikuussa 2007 edennyt PEP 3124 ehdotti mekanismia toimintojen koristamiseksi osoittamaan, että ne voivat olla ylikuormitettuja. Ehdotusta lykättiin pikemminkin kuin hylättiin suoraan - tarkoittaen, että idea oli pohjimmiltaan järkevä, mutta aika ei ollut oikea sen toteuttamiseksi. Yksi tekijä, joka saattaa nopeuttaa ylikuormituksen käyttöönottoa Pythonissa - tai aiheuttaa ajatuksen kokonaan umpeen - on äskettäin ehdotetun mallin sovitusjärjestelmän toteutus.

Teoriassa kuvion sovitusta voitaisiin käyttää konepellin alla ylikuormituksen lähettämiseen. Kuitenkin kuvion sovitus voidaan antaa myös perustana ei geneeristen ominaisuuksien toteuttaminen Pythonissa, koska se tarjoaa jo tyylikkään tavan lähettää tyypin allekirjoituksiin perustuvia toimintoja.

Joten saatamme saada todellisen ylikuormituksen Pythonissa jonain päivänä, tai muut mekanismit voivat korvata sen edut.

Hännän rekursio -optimoinnit

Monet kielen kääntäjät käyttävät pyrstörekursiooptimointeja, joissa itseään kutsuvat toiminnot eivät luo sovellukseen uusia pinokehyksiä ja voivat siten räjähtää pinon, jos ne toimivat liian kauan. Python ei tee tätä, ja itse asiassa sen luojat ovat jatkuvasti vastustaneet sitä.

Yksi syy on se, että suuri osa Pythonista käyttää sitä sisältäpäiniterointi mielummin kuinrekursio - generaattorit, korutiinit ja niin edelleen. Tässä tapauksessa se tarkoittaa funktion käyttöä silmukalla ja pinorakenteella rekursiivisen mekanismin sijaan. Jokainen silmukan kutsu voidaan tallentaa pinoon uuden rekursioiden luomiseksi ja pudota pinosta, kun rekursio on valmis.

Python-kehittäjiä kannustetaan käyttämään näitä malleja rekursioiden sijasta, joten rekursiooptimoinnissa ei ole juurikaan toivoa. Mahdollisuudet eivät ole lainkaan todennäköisiä, koska Pythonin idiomit tukevat muita ratkaisuja.

Multiline lambdas

Lambdas eli nimettömät toiminnot tekivät siitä Pythonin vasta jonkin verran kielenluoja Guido van Rossumin vastustusta vastaan. Koska Python-lambdat ovat nyt olemassa, ne ovat erittäin rajoitettuja: Niiden avulla voit käyttää funktion runkona vain yhtä lauseketta (lähinnä mitä tahansa yhtälömerkin oikealla puolella tehtävämääräyksessä). Jos haluat täydellisen lausejoukon, hajota ne vain ja tee niistä varsinainen toiminto.

Syy tulee kielen suunnitteluun sellaisena kuin van Rossum näkee sen. Kuten van Rossum kirjoitti vuonna 2006, ”löydänminkä tahansa ratkaisua ei voida hyväksyä, joka upottaa sisennykseen perustuvan lohkon lausekkeen keskelle. Koska mielestäni vaihtoehtoinen syntaksiraportti lauseiden ryhmittelylle (esim. Aaltosulkeet tai aloitus- / lopetusavainsanat) on yhtä mahdoton hyväksyä, tämä tekee monirivisestä lambdasta ratkaisemattoman palapelin. "

Toisin sanoen, ongelma ei ole tekninen, mutta monirivisten lambdojen syntaksin puuttuminen, joka täydentäisi nykyistä Python-syntaksin estetiikkaa. Luultavasti ei ole tapaa tehdä sitä, mikä ei sisällä erityistapauksen luomista, ja erityistapauksia kertyvä kieli on yleensä epämiellyttävä käyttää. Kunnes tällainen yksisarvinen ilmestyy, meidän on vain tehtävä erikseen määriteltyjä toimintoja.

Monirivisiä lambdoja ei todennäköisesti tapahdu Pythonissa.

Lue lisää Pythonista:

  • Python 3.9: Mikä on uutta ja parempaa
  • Python 3.8: n parhaat uudet ominaisuudet
  • Parempi Python-projektinhallinta Poetryn avulla
  • Virtualenv ja venv: Python-virtuaaliympäristöt selitetty
  • Python virtualenv ja venv do and don'ts
  • Python-ketjuttaminen ja aliprosessit on selitetty
  • Kuinka käyttää Python-virheenkorjainta
  • Kuinka käyttää timeit Python-koodin profilointiin
  • CProfilen käyttäminen Python-koodin profilointiin
  • Aloita asynkronointi Pythonissa
  • Asyncion käyttäminen Pythonissa
  • Kuinka muuntaa Python JavaScriptiksi (ja takaisin)
  • Python 2 EOL: Kuinka selvitä Python 2: n loppu
  • 12 pyytonia jokaiselle ohjelmointitarpeelle
  • 24 Python-kirjastoa jokaiselle Python-kehittäjälle
  • 7 suloista Python IDE: tä, jotka saatat olla unohtanut
  • 3 suurta Python-puutetta - ja niiden ratkaisut
  • 13 Python-verkkokehystä verrattiin
  • 4 Python-testikehystä vikojen murskaamiseksi
  • 6 upeaa uutta Python-ominaisuutta, joita et halua hukata
  • 5 Python-jakelua koneoppimisen hallitsemiseksi
  • 8 suurta Python-kirjastoa luonnollisen kielen käsittelyyn
  • 6 Python-kirjastoa rinnakkaiskäsittelyä varten
  • Mikä on PyPy? Nopeampi Python ilman kipua
  • Mikä on Cython? Python nopeudella C