Python 3.11 -ohjelmointikielen julkaisu

Vuoden kehitystyön jälkeen Python 3.11 -ohjelmointikielen merkittävä julkaisu on julkaistu. Uutta haaraa tuetaan puolitoista vuotta, jonka jälkeen siihen luodaan vielä kolme ja puoli vuotta korjauksia haavoittuvuuksien poistamiseksi.

Samaan aikaan aloitettiin Python 3.12 -haaran alfatestaus (uuden kehitysaikataulun mukaisesti uuden haaran työ alkaa viisi kuukautta ennen edellisen haaran julkaisua ja siirtyy alfatestausvaiheeseen seuraavan julkaisun aikaan ). Python 3.12 -haara tulee olemaan alfajulkaisussa seitsemän kuukauden ajan, jonka aikana uusia ominaisuuksia lisätään ja vikoja korjataan. Tämän jälkeen beta-versioita testataan kolmen kuukauden ajan, jonka aikana uusien ominaisuuksien lisääminen on kielletty ja kaikki huomio kiinnitetään bugien korjaamiseen. Viimeiset kaksi kuukautta ennen julkaisua haara on julkaisuehdokasvaiheessa, jolloin suoritetaan lopullinen stabilointi.

Uusia lisäyksiä Python 3.11:een ovat:

  • Suorituksen optimoimiseksi on tehty merkittävää työtä. Uusi haara sisältää muutoksia, jotka liittyvät funktiokutsujen kiihdytykseen ja inline-käyttöön, nopeiden standarditoimintojen tulkkien käyttöön (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), sekä Cinder- ja HotPy-projektien valmistelemat optimoinnit. Kuormituksen tyypistä riippuen koodin suoritusnopeus kasvaa 10-60%. Pyperformance-testipaketin suorituskyky kasvoi keskimäärin 25 %.

    Tavukoodin välimuistimekanismia on suunniteltu uudelleen, mikä on lyhentänyt tulkin käynnistysaikaa 10-15 %. Kohteet koodilla ja tavukoodilla allokoidaan nyt staattisesti tulkin toimesta, mikä mahdollisti välimuistista erotetun tavukoodin purkamisen ja objektien muuntamisen dynaamiseen muistiin sijoitettavalla koodilla.

  • Kun puhelujäljiä näytetään diagnostisissa viesteissä, on nyt mahdollista näyttää tietoja virheen aiheuttaneesta lausekkeesta (aiemmin vain rivi oli korostettuna tarkentamatta, mikä linjan osa aiheutti virheen). Laajennetut jäljitystiedot voidaan saada myös API:n kautta ja niitä voidaan käyttää yhdistämään yksittäisiä tavukoodikäskyjä tiettyyn kohtaan lähdekoodissa käyttämällä codeobject.co_positions()-menetelmää tai C API-funktiota PyCode_Addr2Location(). Muutos helpottaa sisäkkäisten sanakirjaobjektien, useiden funktiokutsujen ja monimutkaisten aritmeettisten lausekkeiden ongelmien virheenkorjausta. Traceback (viimeisin puhelu viimeisin): Tiedosto "calculation.py", rivi 54, tulos = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: jako nollalla
  • Lisätty tuki poikkeusryhmille, mikä antaa ohjelmalle mahdollisuuden luoda ja käsitellä useita erilaisia ​​poikkeuksia kerralla. Useiden poikkeusten ryhmittelemiseksi ja nostamiseksi yhteen on ehdotettu uusia poikkeustyyppejä ExceptionGroup ja BaseExceptionGroup, ja "except*"-lauseke on lisätty korostamaan yksittäisiä poikkeuksia ryhmästä.
  • Add_note()-metodi on lisätty BaseException-luokkaan, jonka avulla voit liittää poikkeukseen tekstihuomautuksen, esimerkiksi lisäämällä asiayhteyteen liittyviä tietoja, jotka eivät ole käytettävissä, kun poikkeus heitetään.
  • Lisätty erityinen Self-tyyppi edustamaan nykyistä yksityistä luokkaa. Selfillä voidaan merkitä menetelmiä, jotka palauttavat luokkansa ilmentymän yksinkertaisemmin kuin käyttämällä TypeVaria. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Lisätty erityinen LiteralString-tyyppi, joka voi sisältää vain LiteralString-tyypin kanssa yhteensopivia merkkijonoliteraaaleja (eli paljaat ja LiteralString-merkkijonot, mutta ei mielivaltaisia ​​tai yhdistettyjä merkkijonoja). LiteralString-tyyppiä voidaan käyttää rajoittamaan merkkijonoargumenttien välittämistä funktioille, mikä voi johtaa haavoittuvuuksiin esimerkiksi luotaessa merkkijonoja SQL-kyselyille tai komentotulkkikomentoille. def run_query(sql: LiteralString) -> ... ... def caller( mielivaltainen_merkkijono: str, kyselyn_merkkijono: LiteralString, taulukon_nimi: LiteralString, ) -> Ei mitään: run_query("SELECT * FROM opiskelijoilta") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM opiskelijoille WHERE nimi = {mielivaltainen_merkkijono}" )
  • TypeVarTuple-tyyppi on lisätty, mikä mahdollistaa muuttujien yleisten ominaisuuksien käytön, toisin kuin TypeVar, joka ei kata yhtä tyyppiä, vaan mielivaltaisen määrän tyyppejä.
  • Vakiokirjasto sisältää tomllib-moduulin funktioilla TOML-muodon jäsentämiseksi.
  • On mahdollista merkitä kirjoitettujen sanakirjojen (TypedDict) yksittäisiä elementtejä Required- ja NotRequired-tunnisteilla pakollisten ja valinnaisten kenttien määrittämiseksi (oletusarvoisesti kaikki ilmoitetut kentät ovat pakollisia, jos kokonaisparametrin arvo ei ole False). luokan Elokuva(TypedDict): nimi: str vuosi: Ei vaadita[int] m1: Elokuva = {"nimi": "Black Panther", "year": 2018} # OK m2: Elokuva = {"nimi": "Star Wars" } # OK (vuosikenttä on valinnainen) m3: Elokuva = {"vuosi": 2022} # Virhe, vaadittua otsikkokenttää ei ole täytetty)
  • TaskGroup-luokka on lisätty asynkroniseen moduuliin asynkronisen kontekstinhallinnan avulla, joka odottaa ryhmän tehtäviä valmistuvan. Tehtävien lisääminen ryhmään tapahtuu create_task()-menetelmällä. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(toinen_coro(...)) print("Molemmat tehtävät on nyt suoritettu .")
  • Lisätty @dataclass_transform-decorator luokille, menetelmille ja funktioille, kun se on määritetty, staattinen tyypintarkistusjärjestelmä käsittelee objektia ikään kuin käyttäisi @dataclasses.dataclass-koristelijaa. Alla olevassa esimerkissä CustomerModel-luokka tyyppejä tarkistettaessa käsitellään samalla tavalla kuin luokka @dataclasses.dataclass-koristeella, eli. koska siinä on __init__-metodi, joka hyväksyy id- ja nimimuuttujat. @dataclass_transform() luokka ModelBase: ... luokka CustomerModel(ModelBase): id: int nimi: str
  • Säännöllisiin lausekkeisiin on lisätty mahdollisuus käyttää atomiryhmittelyä ((?>...)) ja omistusarvoja (*+, ++, ?+, {m,n}+).
  • Lisätty komentorivivaihtoehto "-P" ja PYTHONSAFEPATH-ympäristömuuttuja estämään mahdollisesti vaarallisten tiedostopolkujen automaattinen liittäminen sys.path-tiedostoon.
  • Windows-alustan py.exe-apuohjelmaa on parannettu merkittävästi lisäämällä tuen "-V:"-syntaksille. / " lisäksi "- . "
  • Monet C API:n makrot muunnetaan tavallisiksi tai staattisiksi rivifunktioiksi.
  • Moduulit uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev ja sunau on vanhentuneita ja poistetaan Pythonissa 3.13 julkaisu. PyUnicode_Encode*-funktiot poistettu.

Lähde: opennet.ru

Lisää kommentti