După un an de dezvoltare, a fost lansată o versiune semnificativă a limbajului de programare Python 3.11. Această ramură va fi susținută timp de un an și jumătate, după care vor fi formulate corecturi de securitate timp de încă trei ani și jumătate.
În paralel, a început testarea alfa a ramurii Python 3.12 (conform noului calendar de dezvoltare, lucrul la noua ramură începe cu cinci luni înainte de lansarea ramurii precedente și, până la următoarea lansare, ajunge în stadiul de testare alfa). Ramura Python 3.12 va fi în stadiul lansărilor alfa timp de șapte luni, în care vor fi adăugate noi funcționalități și vor fi corectate erori. După aceea, timp de trei luni, vor avea loc teste beta, în timpul cărora adăugarea de noi funcționalități va fi interzisă, iar toată atenția va fi concentrată pe corectarea erorilor. Ultimele două luni înainte de lansare, ramura va fi în stadiul candidaților pentru lansare, pe care va avea loc stabilizarea finală.
Printre noutățile aduse de Python 3.11 se numără:
- Au fost realizate lucrări semnificative de optimizare a performanței. Noua ramură include modificări legate de accelerarea și desfășurarea inline a apelurilor de funcții, utilizarea de interpretoare rapide pentru operații de tip (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), precum și optimizările pregătite de proiectele Cinder și HotPy. În funcție de tipul de sarcină, s-a observat o creștere a vitezei de execuție a codului de 10-60%. În medie, performanța în urma trecerii la setul de teste pyperformance a crescut cu 25%.
Mecanismul de caching al bytecode-ului a fost reproiectat, ceea ce a permis reducerea timpului de inițiere a interpretorului cu 10-15%. Obiectele cu cod și bytecode sunt acum alocate static de către interpretor, ceea ce a permis eliminarea etapelor de demarshalling a bytecode-ului extras din cache și transformarea obiectelor cu cod pentru alocarea în memoria dinamică.
- At the display of call trace in diagnostic messages, information about the expression that caused the error is provided (previously only the line was highlighted without detailing which part of the line caused the error). Extended trace information can also be obtained via the API and used to match individual bytecode instructions with a specific position in the source code using the method codeobject.co_positions() or the C API function PyCode_Addr2Location(). This change significantly simplifies debugging issues related to nested dictionary objects, multiple function calls, and complex arithmetic expressions. Traceback (most recent call last): File "calculation.py", line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Support for exception groups has been added, allowing the program to generate and handle multiple different exceptions simultaneously. New exception types, ExceptionGroup and BaseExceptionGroup, have been introduced for grouping several exceptions and calling them together, and the expression "except*" has been added to extract individual exceptions from a group.
- A method add_note() has been added to the BaseException class, allowing a text note to be attached to an exception, for instance, to add contextual information unavailable during the exception generation.
- A special type Self has been added, representing the current closed class. Self can be used for annotating methods that return an instance of their class in a simpler way than using TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- A fost adăugat un tip special LiteralString, care poate include doar literele de tip string compatibile cu tipul LiteralString (adică, stringuri simple și stringuri de tip LiteralString, dar nu stringuri arbitrare sau combinate de tip str). Tipul LiteralString poate fi folosit pentru a restricționa transmiterea argumentelor de tip string către funcții, unde substituirea arbitrară a unor părți din string poate duce la vulnerabilități, de exemplu, în formarea stringurilor pentru interogări SQL sau comenzi shell. 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) # Eroare run_query( # Eroare f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- A fost adăugat tipul TypeVarTuple, care permite utilizarea generics variabile, spre deosebire de TypeVar care acoperă un singur tip, ci un număr arbitrar de tipuri.
- În biblioteca standard a fost inclus modulul tomllib cu funcții pentru analiza formatului TOML.
- A fost oferită posibilitatea de a marca elementele individuale ale dicționarelor tipizate (TypedDict) cu etichetele Required și NotRequired pentru a determina câmpurile obligatorii și cele opționale (în mod implicit, toate câmpurile declarate sunt obligatorii de completat, dacă parametrul total nu este setat la False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (câmpul year este opțional) m3: Movie = {«year»: 2022} # Eroare, nu este completat câmpul obligatoriu title)
- În modulul asyncio a fost adăugat clasa TaskGroup cu implementarea unui manager de context asincron, care așteaptă finalizarea unui grup de sarcini. Adăugarea sarcinilor în grup se face prin metoda create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Ambele sarcini s-au finalizat acum.»)
- A fost adăugat decoratorul pentru clase, metode și funcții @dataclass_transform, care, atunci când este specificat, permite sistemului de verificare a tipurilor statice să interpreteze obiectul ca și cum ar folosi decoratorul @dataclasses.dataclass. În exemplul de mai jos, clasa CustomerModel va fi procesată similar cu clasa care folosește decoratorul @dataclasses.dataclass, adică va avea metoda __init__ care permite variabilele id și name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- În expresiile regulate a fost adăugată posibilitatea de a folosi gruparea atomică ((?>…)) și cuantificatori posesivi (*+, ++, ?+, {m,n}+).
- A fost adăugată opțiunea din linia de comandă „-P” și variabila de mediu PYTHONSAFEPATH pentru a dezactiva atașarea automată la sys.path a căilor de fișiere potențial nesigure.
- Utilitarul py.exe pentru platforma Windows a fost îmbunătățit semnificativ, având suport pentru sintaxa „-V:/” pe lângă „-.”.
- Multe macro-uri din API-ul C au fost convertite în funcții inline obișnuite sau statice.
- Modulele uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev și sunau au fost declarate ca fiind învechite și vor fi eliminate în versiunea Python 3.13. Funcțiile PyUnicode_Encode* au fost eliminate.
Sursa: opennet.ro
