Izdanje programskog jezika Python 3.11

Nakon godinu dana razvoja, objavljeno je značajno izdanje programskog jezika Python 3.11. Nova grana bit će podržana godinu i pol, nakon čega će se još tri i pol godine za nju generirati popravci kako bi se uklonile ranjivosti.

U isto vrijeme započelo je alfa testiranje grane Python 3.12 (u skladu s novim rasporedom razvoja, rad na novoj grani počinje pet mjeseci prije izdanja prethodne grane i dostiže fazu alfa testiranja do sljedećeg izdanja ). Ogranak Python 3.12 bit će u alfa izdanju sedam mjeseci, tijekom kojih će se dodavati nove značajke i ispravljati greške. Nakon toga, beta verzije će se testirati tri mjeseca, tijekom kojih će dodavanje novih značajki biti zabranjeno i sva će se pozornost posvetiti ispravljanju grešaka. Posljednja dva mjeseca prije puštanja grana će biti u fazi kandidata za puštanje, pri čemu će se izvršiti konačna stabilizacija.

Novi dodaci Pythonu 3.11 uključuju:

  • Obavljen je značajan rad na optimizaciji performansi. Nova grana uključuje promjene koje se odnose na 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. Ovisno o vrsti opterećenja, dolazi do povećanja brzine izvršavanja koda od 10-60%. U prosjeku, izvedba na testu pyperformance porasla je za 25%.

    Mehanizam predmemoriranja bajt koda je redizajniran, što je smanjilo vrijeme pokretanja tumača za 10-15%. Objekte s kodom i bajt-kodom sada statički dodjeljuje tumač, što je omogućilo eliminiranje faza deklasiranja bajt-koda izvađenog iz predmemorije i pretvaranje objekata s kodom za smještaj u dinamičku memoriju.

  • Prilikom prikaza tragova poziva u dijagnostičkim porukama, sada je moguće prikazati informacije o izrazu koji je uzrokovao pogrešku (ranije je samo linija bila označena bez detalja koji je dio linije uzrokovao pogrešku). Proširene informacije o praćenju također se mogu dobiti putem API-ja i koristiti za mapiranje pojedinačnih instrukcija bajt-koda 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 pogrešaka s ugniježđenim objektima rječnika, višestrukim pozivima funkcija i složenim aritmetičkim izrazima. Traceback (posljednji posljednji poziv): datoteka "calculation.py", redak 54, u rezultatu = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: dijeljenje s nulom
  • Dodana podrška za grupe izuzetaka, dajući programu mogućnost generiranja i obrade nekoliko različitih izuzetaka odjednom. Za grupiranje više izuzetaka i njihovo podizanje zajedno, predložene su nove vrste izuzetaka ExceptionGroup i BaseExceptionGroup, a dodan je izraz "except*" za isticanje pojedinačnih izuzetaka iz grupe.
  • Metoda add_note() dodana je klasi BaseException, omogućujući vam da priložite tekstualnu bilješku uz iznimku, na primjer, dodavanje kontekstualnih informacija koje nisu dostupne kada se izbaci iznimka.
  • Dodan je poseban tip Self za predstavljanje trenutne privatne klase. Self se može koristiti za označavanje metoda koje vraćaju instancu svoje klase na jednostavniji način od korištenja TypeVar. klasa MyLock: def __enter__(self) -> Self: self.lock() return self
  • Dodan je poseban tip LiteralString koji može uključivati ​​samo literale niza koji su kompatibilni s tipom LiteralString (tj. gole nizove i nizove LiteralString, ali ne proizvoljne ili kombinirane nizove str). Tip LiteralString može se koristiti za ograničavanje prosljeđivanja argumenata niza funkcijama, proizvoljna zamjena dijelova nizova u kojima može dovesti do ranjivosti, na primjer, prilikom generiranja nizova 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 students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • Tip TypeVarTuple je dodan, dopuštajući korištenje varijabilnih generičkih, za razliku od TypeVar, koji ne pokriva jedan tip, već proizvoljan broj tipova.
  • Standardna biblioteka uključuje tomllib modul s funkcijama za raščlanjivanje TOML formata.
  • Moguće je označiti pojedinačne elemente tipiziranih rječnika (TypedDict) oznakama Required i NotRequired kako bi se odredila obavezna i izborna polja (prema zadanim postavkama sva deklarirana polja su obavezna ako ukupni parametar nije postavljen na False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # U redu (polje godine nije obavezno) m3: Film = {“godina”: 2022} # Pogreška, obavezno polje naslova nije popunjeno)
  • Klasa TaskGroup dodana je modulu asyncio s implementacijom upravitelja asinkronog konteksta koji čeka da se grupa zadataka završi. Dodavanje zadataka u grupu vrši se metodom create_task(). async def main(): async s asyncio.TaskGroup() kao tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Oba su zadatka sada završena .")
  • Dodan dekorater @dataclass_transform za klase, metode i funkcije, kada je navedeno, sustav za statičku provjeru tipa tretira objekt kao da koristi dekorater @dataclasses.dataclass. U donjem primjeru, klasa CustomerModel, kada provjerava tipove, bit će obrađena slično kao klasa s @dataclasses.dataclass dekoratorom, tj. kao da ima metodu __init__ koja prihvaća varijable id i name. @dataclass_transform() klasa ModelBase: ... klasa CustomerModel(ModelBase): id: int name: str
  • U regularnim izrazima dodana je mogućnost korištenja atomskog grupiranja ((?>...)) i posvojnih kvantifikatora (*+, ++, ?+, {m,n}+).
  • Dodana opcija naredbenog retka "-P" i varijabla okruženja PYTHONSAFEPATH za onemogućavanje automatskog privitka potencijalno nesigurnih putova datoteka na sys.path.
  • Uslužni program py.exe za Windows platformu značajno je poboljšan, dodajući podršku za sintaksu “-V:”. / " pored "- . "
  • Mnoge makronaredbe u C API-ju pretvaraju se u regularne ili statičke ugrađene funkcije.
  • Moduli uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau su zastarjeli i bit će uklonjeni u Pythonu 3.13 izdanje. Uklonjene PyUnicode_Encode* funkcije.

Izvor: opennet.ru

Dodajte komentar