Lansarea limbajului de programare Python 3.11

După un an de dezvoltare, a fost publicată o lansare semnificativă a limbajului de programare Python 3.11. Noua ramură va fi susținută timp de un an și jumătate, după care se vor forma patch-uri cu vulnerabilități pentru încă trei ani și jumătate.

În același timp, a început testarea alfa a ramurii Python 3.12 (în conformitate cu noul program de dezvoltare, lucrul la o nouă ramură începe cu cinci luni înainte de lansarea ramurii anterioare și ajunge la etapa de testare alfa până la următoarea lansare). ). Ramura Python 3.12 va fi în versiuni alfa timp de șapte luni, timp în care vor fi adăugate noi funcții și erorile vor fi remediate. După aceea, testarea beta va fi efectuată timp de trei luni, timp în care adăugarea de noi funcții va fi interzisă și toată atenția va fi acordată remedierii erorilor. În ultimele două luni înainte de eliberare, filiala se va afla în stadiul de candidat la eliberare, la care se va efectua stabilizarea finală.

Noile completări în Python 3.11 includ:

  • S-a făcut o muncă semnificativă pentru optimizarea performanței. Noua ramură include modificări legate de accelerarea și implementarea inline a apelurilor de funcții, utilizarea de interpreți rapidi ai operațiilor tipice (x+x, x*x, xx, 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 încărcare, există o creștere a vitezei de execuție a codului cu 10-60%. În medie, performanța la trecerea suita de teste pyperformance a crescut cu 25%.

    Mecanismul de stocare în cache a codului octet a fost reproiectat, ceea ce a redus timpul de pornire a interpretului cu 10-15%. Obiectele cu cod și bytecode sunt acum alocate static de către interpret, ceea ce a făcut posibilă eliminarea etapelor de demarshaling a bytecode extras din cache și conversia obiectelor cu cod pentru plasarea în memoria dinamică.

  • La afișarea urmelor de apel în mesajele de diagnosticare, sunt furnizate informații despre expresia care a provocat eroarea (anterior, doar linia era evidențiată fără a detalia ce parte a liniei a cauzat eroarea). Informațiile extinse de urmărire pot fi, de asemenea, preluate prin intermediul API-ului și utilizate pentru a mapa instrucțiunile de bytecode individuale la o anumită poziție din codul sursă folosind metoda codeobject.co_positions() sau funcția API C PyCode_Addr2Location() . Schimbarea simplifică foarte mult problemele de depanare asociate cu obiectele dicționar imbricate, apelurile de funcții multiple și expresiile aritmetice complexe. Urmărire (cel mai recent apel ultimul): fișier „calculation.py”, rândul 54, în rezultat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: împărțire la zero
  • S-a adăugat suport pentru grupuri de excepții, oferind programului capacitatea de a genera și procesa mai multe excepții diferite în același timp. Noi tipuri de excepții ExceptionGroup și BaseExceptionGroup sunt propuse pentru gruparea mai multor excepții și invocarea lor comună, iar expresia „cu excepția*” este adăugată pentru a separa excepțiile dintr-un grup.
  • Metoda add_note() a fost adăugată la clasa BaseException, care vă permite să atașați o notă text la excepție, de exemplu, pentru a adăuga informații contextuale care nu sunt disponibile în momentul în care a fost aruncată excepția.
  • A fost adăugat un tip special Self pentru a reprezenta clasa privată curentă. Self poate fi folosit pentru a adnota metode care returnează o instanță a clasei lor într-un mod mai simplu decât folosind TypeVar. clasa MyLock: def __enter__(self) -> Self: self.lock() return self
  • A fost adăugat un tip special LiteralString care poate include doar literale șir care sunt compatibile cu tipul LiteralString (adică șiruri goale și șiruri de caractere de tip LiteralString, dar nu șiruri arbitrare sau combinate de tip str). Tipul LiteralString poate fi folosit pentru a limita transmiterea de argumente șir la funcții, înlocuirea arbitrară a părților șirurilor în care poate duce la vulnerabilități, de exemplu, la generarea de șiruri pentru interogări SQL sau comenzi shell. def run_query(sql: LiteralString) -> ... ... def apelant( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Niciunul: 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}" )
  • A fost adăugat tipul TypeVarTuple, care permite utilizarea genericelor variabile, spre deosebire de TypeVar, acoperind nu un tip, ci un număr arbitrar de tipuri.
  • Biblioteca standard include modulul tomllib cu funcții pentru analizarea formatului TOML.
  • Capacitatea de a marca elemente individuale ale dicționarelor tastate (TypedDict) cu marcajele Obligatoriu și NotRequired este oferită pentru a determina câmpurile obligatorii și opționale (în mod implicit, toate câmpurile declarate sunt obligatorii dacă parametrul total nu este setat la Fals). clasa Film(TypedDict): titlu: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (câmpul pentru anul este opțional) m3: Film = {"year": 2022} # Eroare, câmpul de titlu obligatoriu nu a fost completat)
  • Clasa TaskGroup a fost adăugată la modulul asincron cu implementarea unui manager de context asincron care așteaptă finalizarea grupului de activități. Adăugarea de sarcini la un grup se face folosind metoda create_task(). async def main(): async cu asyncio.TaskGroup() ca tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print("Ambele sarcini s-au finalizat acum.")
  • S-a adăugat un decorator de clasă, metodă și funcție @dataclass_transform, când este specificat, verificatorul de tip static tratează obiectul ca și cum ar folosi decoratorul @dataclasses.dataclass. În exemplul de mai jos, clasa CustomerModel va fi verificată ca o clasă cu decoratorul @dataclasses.dataclass, de exemplu. ca având o metodă __init__ care permite variabile id și nume. @dataclass_transform() clasă ModelBase: … clasă CustomerModel(ModelBase): id: int nume: str
  • S-a adăugat capacitatea de a folosi cuantificatori de grupare atomică ((?>…)) și geloși (posesivi) (*+, ++, ?+, {m,n}+) în expresiile regulate.
  • S-au adăugat opțiunea de linie de comandă „-P” și variabila de mediu PYTHONSAFEPATH pentru a dezactiva atașarea automată a căilor de fișiere potențial nesigure la sys.path.
  • S-a îmbunătățit semnificativ utilitarul py.exe pentru platforma Windows, care acum acceptă sintaxa „-V:”. / " în plus față de "- . ".
  • Multe macrocomenzi din API-ul C au fost convertite în funcții inline normale 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 depreciate și vor fi eliminate în Python Versiunea 3.13. S-au eliminat funcțiile PyUnicode_Encode*.

Sursa: opennet.ru

Adauga un comentariu