Nakon godine razvoja objavljen je značajan izdanak programskog jezika Python 3.11. Nova grana će se podržavati tijekom sljedećih godinu i pol dana, nakon čega će se još tri i pol godine stvarati popravci za ispravljanje ranjivosti.
Istovremeno je započelo alfa testiranje grane Python 3.12 (prema novom rasporedu razvoja, rad na novoj grani počinje pet mjeseci prije izdavanja prethodne grane, a do trenutka sljedećeg izdanja doseže fazu alfa testiranja). Grana Python 3.12 bit će u fazi alfa izdanja tijekom sedam mjeseci, tijekom kojih će se dodavati nove mogućnosti i ispravljati greške. Nakon toga, tijekom tri mjeseca provodit će se beta testiranje, tijekom kojeg će dodavanje novih mogućnosti biti zabranjeno, a sva pažnja posvetit će se ispravljanju grešaka. Posljednja dva mjeseca prije izdanja, grana će biti u fazi kandidata za izdanja, tijekom koje će se provesti konačna stabilizacija.
Među novostima koje su dodane u Python 3.11 su:
- Proveden je značajan rad na optimizaciji performansi. U novu granu uključene su promjene vezane uz ubrzavanje i inline raspoređivanje poziva funkcija, primjenu brzih interpretatora tipičnih operacija (x+x, x*x, x-x, 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, zabilježen je porast brzine izvršavanja koda od 10-60%. U prosjeku su se performanse tijekom prolaska kroz testni set pyperformance povećale za 25%.
Preuređen je mehanizam keširanja bytecode-a, što je omogućilo smanjenje vremena pokretanja interpreter-a za 10-15%. Objekti s kodom i bytecode sada se statički raspoređuju od strane interpreter-a, što je omogućilo isključenje faza demarshalling-a izvučenog iz keša bytecode-a i pretvaranja objekata s kodom za smještaj u dinamičku memoriju.
- Prikazom praćenja poziva u dijagnostičkim porukama omogućeno je prikazivanje informacija o izrazu koji je uzrokovao grešku (ranije je bio istaknut samo redak bez detalja o tome koji je dio stringa uzrokovao grešku). Proširene informacije o praćenju također se mogu dobiti putem API-ja i koristiti za povezivanje pojedinačnih instrukcija bajtkoda s određenom pozicijom u izvornoj kodu, koristeći metodu codeobject.co_positions() ili funkciju C API PyCode_Addr2Location(). Ova promjena značajno olakšava otklanjanje grešaka povezanih s ugniježdenim objektima rječnika, višestrukim pozivima funkcija i složenim aritmetičkim izrazima. Traceback (most recent call last): File "calculation.py", line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Dodana je podrška za grupe izuzetaka, koja omogućava programu da generira i obrađuje više različitih izuzetaka istovremeno. Za grupiranje više izuzetaka i njihovo zajedničko pozivanje uvedene su nove vrste izuzetaka ExceptionGroup i BaseExceptionGroup, a za isticanje pojedinačnih izuzetaka iz grupe dodano je izraz "except*".
- U klasu BaseException dodana je metoda add_note(), koja omogućava pridruživanje tekstualne napomene izuzecima, na primjer, dodavanje kontekstualnih informacija koje nisu bile dostupne tijekom generiranja izuzetka.
- Dodana je posebna vrsta Self, koja predstavlja trenutnu zatvorenu klasu. Self se može koristiti za anotiranje metoda koji vraćaju instancu svoje klase, na jednostavniji način nego korištenjem TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Dodana je posebna vrsta LiteralString koja može sadržavati samo string literale, kompatibilne s tipom LiteralString (tj. obične stringove i stringove s tipom LiteralString, ali ne proizvoljne i ne kombinirane stringove s tipom str). Tip LiteralString može se koristiti za ograničavanje prosljeđivanja string argumentima funkcijama, čija proizvoljna zamjena dijelova stringa može dovesti do ranjivosti, npr. prilikom formiranja stringova za SQL upite ili shell naredbe. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(„SELECT * FROM students“) # 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 students WHERE name = {arbitrary_string}“ )
- Dodana je vrsta TypeVarTuple koja omogućava korištenje varijabilnih generičkih tipova, za razliku od TypeVar koji obuhvaća samo jedan tip, nego proizvoljni broj tipova.
- U standardnu biblioteku je uključen modul tomllib s funkcijama za parsiranje TOML formata.
- Omogućeno je označavanje pojedinih elemenata tipiziranih rječnika (TypedDict) oznakama Required i NotRequired za određivanje obaveznih i neobaveznih polja (po zadanim postavkama, sva ograničena polja su obavezna za ispuniti, osim ako parametar total 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“} # OK (polje year nije obavezno) m3: Movie = {„year“: 2022} # Greška, obavezno polje title nije ispunjeno)
- U modul asyncio dodana je klasa TaskGroup s implementacijom asinkronog kontekstnog upravitelja, koji čeka završetak grupe zadataka. Dodavanje zadataka u grupu obavlja se putem metode create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(„Oba zadatka su sada završena.“)
- Dodana je dekorator klasa, metoda i funkcija @dataclass_transform, pri čemu sustav provjere statičkih tipova tretira objekt kao pri korištenju dekoratora @dataclasses.dataclass. U sljedećem primjeru, klasa CustomerModel će se tijekom provjere tipova obraditi na sličan način kao klasa s dekoratorom @dataclasses.dataclass, tj. kao klasa koja ima __init__ metodu koja prihvaća varijable id i name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- U regularnim izrazima dodana je mogućnost korištenja atomske grupacije ((?>…)) i posesivnih kvantifikatora (*+, ++, ?+, {m,n}+).
- Dodana je opcija naredbenog retka «-P» i varijabla okruženja PYTHONSAFEPATH za onemogućavanje automatskog pridruživanja potencijalno nesigurnih datotečnih putanja sys.path-u.
- Significantly ispravljen alat py.exe za platformu Windows, koji sada podržava sintaksu «-V:<company>\/<tag>» uz «-<major>.<minor>».
- Mnogi makroi u C API-ju transformirani su u obične ili statičke inline funkcije.
- Proglašeni su zastarjelima i bit će uklonjeni u izdanju Pythona 3.13 moduli uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau. Uklonjene su funkcije PyUnicode_Encode*.
Izvor: opennet.ru
