Izdanje programskog jezika Python 3.11

Nakon godinu dana razvoja, objavljeno je značajno izdanje programskog jezika Python 3.11. Nova grana će biti podržana godinu i po, nakon čega će se još tri i po godine generisati popravke za nju kako bi se otklonile ranjivosti.

Istovremeno je počelo alfa testiranje grane Python 3.12 (u skladu s novim rasporedom razvoja, rad na novoj grani počinje pet mjeseci prije izlaska prethodne grane i dostiže fazu alfa testiranja do trenutka sljedećeg izdanja ). Grana Python 3.12 će biti u alfa izdanju sedam mjeseci, tokom kojih će biti dodane nove funkcije i ispravljene greške. Nakon toga, beta verzije će biti testirane tri mjeseca, tokom kojih će dodavanje novih funkcija biti zabranjeno i sva pažnja će biti posvećena ispravljanju grešaka. Posljednja dva mjeseca prije puštanja, grana će biti u fazi kandidata za oslobađanje, u kojoj će se izvršiti konačna stabilizacija.

Novi dodaci za Python 3.11 uključuju:

  • Urađen je značajan posao na optimizaciji performansi. Nova grana uključuje promjene vezane za ubrzanje i inline implementaciju poziva funkcija, korištenje brzih interpretatora standardnih operacija (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), kao i optimizacije koje su pripremili projekti Cinder i HotPy. U zavisnosti od vrste opterećenja dolazi do povećanja brzine izvršavanja koda od 10-60%. U prosjeku, performanse na pyperformance test paketu porasle su za 25%.

    Mehanizam keširanja bajtkoda je redizajniran, što je smanjilo vrijeme pokretanja tumača za 10-15%. Objekti sa kodom i bajt kodom sada su statički alocirani od strane interpretatora, što je omogućilo da se eliminišu faze demarširanja bajtkoda ekstrahovanog iz keš memorije i pretvaranja objekata sa kodom koji se smeštaju u dinamičku memoriju.

  • Prilikom prikaza tragova poziva u dijagnostičkim porukama, sada je moguće prikazati informacije o izrazu koji je izazvao grešku (ranije je samo linija bila istaknuta bez detalja koji je dio reda izazvao grešku). Proširene informacije o praćenju se također mogu dobiti preko API-ja i koristiti za mapiranje pojedinačnih instrukcija bajtkoda na određenu poziciju u izvornom kodu pomoću metode codeobject.co_positions() ili C API funkcije PyCode_Addr2Location(). Ova promjena znatno olakšava otklanjanje grešaka s ugniježđenim objektima rječnika, višestrukim pozivima funkcija i složenim aritmetičkim izrazima. Traceback (posljednji poziv posljednji): Fajl "calculation.py", red 54, u rezultatu = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: podjela na nulu
  • Dodata podrška za grupe izuzetaka, dajući programu mogućnost da generiše i obrađuje nekoliko različitih izuzetaka odjednom. Za grupisanje više izuzetaka i njihovo podizanje zajedno, predloženi su novi tipovi izuzetaka ExceptionGroup i BaseExceptionGroup, a izraz “except*” je dodan za isticanje pojedinačnih izuzetaka iz grupe.
  • Metoda add_note() dodana je klasi BaseException, omogućavajući vam da priložite tekstualnu bilješku izuzetku, na primjer, dodavanjem kontekstualnih informacija koje nisu dostupne kada se izbaci izuzetak.
  • Dodan poseban tip Self koji predstavlja trenutnu privatnu klasu. Self se može koristiti za označavanje metoda koje vraćaju instancu svoje klase na jednostavniji način nego korištenje TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Dodan je poseban tip LiteralString koji može uključivati ​​samo literale stringova koji su kompatibilni sa tipom LiteralString (tj. goli i LiteralString stringovi, ali ne i proizvoljni ili kombinirani stringovi). Tip LiteralString se može koristiti za ograničavanje prosljeđivanja argumenata niza funkcijama, proizvoljne zamjene dijelova nizova u kojima može dovesti do ranjivosti, na primjer, prilikom generiranja stringova za SQL upite ili naredbe ljuske. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Ništa: run_query("SELECT * FROM student") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Greška run_query( # Greška f"SELECT * FROM student WHERE name = {arbitrary_string}" )
  • Dodan je tip TypeVarTuple, koji omogućava upotrebu varijabilnih generika, za razliku od TypeVar, koji pokrivaju ne jedan tip, već proizvoljan broj tipova.
  • Standardna biblioteka uključuje modul tomllib sa funkcijama za raščlanjivanje TOML formata.
  • Moguće je označiti pojedinačne elemente otkucanih rječnika (TypedDict) oznakama Required i NotRequired kako bi se odredila obavezna i opciona polja (podrazumevano, sva deklarisana polja su obavezna ako ukupni parametar nije postavljen na False). class Movie(TypedDict): title: str godina: NotRequired[int] m1: Film = {"title": "Crni Panter", "year": 2018} # OK m2: Film = {"title": "Ratovi zvijezda" } # OK (polje godina je opciono) m3: Film = {“godina”: 2022} # Greška, potrebno polje naslova nije popunjeno)
  • Klasa TaskGroup je dodana asyncio modulu sa implementacijom asinhronog menadžera konteksta koji čeka da se grupa zadataka završi. Dodavanje zadataka u grupu vrši se pomoću metode create_task(). async def main(): async sa asyncio.TaskGroup() kao tg: zadatak1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Oba zadatka su sada završena .")
  • Dodan @dataclass_transform dekorator za klase, metode i funkcije, kada je specificiran, sistem za provjeru statičnog tipa tretira objekt kao da koristi @dataclass.dataclass dekorator. U primjeru ispod, klasa CustomerModel će se prilikom provjere tipova obraditi slično klasi sa dekoratorom @dataclasses.dataclass, tj. kao da ima __init__ metodu koja prihvata id i name varijable. @dataclass_transform() klasa ModelBase: … klasa CustomerModel(ModelBase): id: int ime: str
  • U regularnim izrazima dodata je mogućnost upotrebe atomskog grupisanja ((?>...)) i posesivnih kvantifikatora (*+, ++, ?+, {m,n}+).
  • Dodata opcija komandne linije "-P" i varijabla okruženja PYTHONSAFEPATH kako bi se onemogućilo automatsko pričvršćivanje potencijalno nesigurnih putanja datoteka na sys.path.
  • Uslužni program py.exe za Windows platformu je značajno poboljšan, dodajući podršku za "-V:" sintaksu. / " pored "- . "
  • Mnogi makroi u C API-ju se pretvaraju u regularne ili statičke inline funkcije.
  • Uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau moduli su zastarjeli i bit će uklonjeni u P-u 3.13 izdanje. Uklonjene funkcije PyUnicode_Encode*.

izvor: opennet.ru

Dodajte komentar