Rilascio del linguaggio di programmazione Python 3.11

Dopo un anno di sviluppo è stata pubblicata l'importante release del linguaggio di programmazione Python 3.11. Il nuovo ramo sarà supportato per un anno e mezzo, dopodiché per altri tre anni e mezzo verranno generate correzioni per eliminare le vulnerabilità.

Allo stesso tempo, è iniziato il test alpha del ramo Python 3.12 (secondo il nuovo programma di sviluppo, il lavoro su un nuovo ramo inizia cinque mesi prima del rilascio del ramo precedente e raggiunge la fase di test alpha al momento del rilascio successivo ). Il ramo Python 3.12 sarà in versione alpha per sette mesi, durante i quali verranno aggiunte nuove funzionalità e risolti bug. Successivamente, le versioni beta verranno testate per tre mesi, durante i quali sarà vietata l'aggiunta di nuove funzionalità e tutta l'attenzione sarà prestata alla correzione dei bug. Negli ultimi due mesi prima del rilascio, il branch sarà nella fase di release candidate, nella quale verrà eseguita la stabilizzazione finale.

Le nuove aggiunte a Python 3.11 includono:

  • È stato svolto un lavoro significativo per ottimizzare le prestazioni. Il nuovo ramo include modifiche relative all'accelerazione e all'implementazione in linea delle chiamate di funzione, l'uso di interpreti veloci di operazioni standard (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), nonché ottimizzazioni preparate dai progetti Cinder e HotPy. A seconda del tipo di carico si verifica un aumento della velocità di esecuzione del codice del 10-60%. In media, le prestazioni sulla suite di test pyperformance sono aumentate del 25%.

    Il meccanismo di memorizzazione nella cache del bytecode è stato riprogettato, riducendo il tempo di avvio dell'interprete del 10-15%. Gli oggetti con codice e bytecode vengono ora allocati staticamente dall'interprete, il che ha permesso di eliminare le fasi di unmarshalling del bytecode estratto dalla cache e di conversione degli oggetti con codice da inserire nella memoria dinamica.

  • Quando si visualizzano le tracce delle chiamate nei messaggi di diagnostica, ora è possibile visualizzare informazioni sull'espressione che ha causato l'errore (in precedenza veniva evidenziata solo la riga senza dettagliare quale parte della riga causava l'errore). È inoltre possibile ottenere informazioni di traccia estese tramite l'API e utilizzarle per mappare singole istruzioni bytecode in una posizione specifica nel codice sorgente utilizzando il metodo codeobject.co_positions() o la funzione API C PyCode_Addr2Location(). La modifica rende molto più semplice il debug dei problemi con oggetti dizionario nidificati, chiamate a funzioni multiple ed espressioni aritmetiche complesse. Traceback (chiamata più recente per ultima): File "calculation.py", riga 54, nel risultato = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: divisione per zero
  • Aggiunto il supporto per i gruppi di eccezioni, dando al programma la possibilità di generare ed elaborare diverse eccezioni contemporaneamente. Per raggruppare più eccezioni e sollevarle insieme, sono stati proposti i nuovi tipi di eccezione ExceptionGroup e BaseExceptionGroup ed è stata aggiunta l'espressione "eccetto*" per evidenziare le singole eccezioni di un gruppo.
  • Il metodo add_note() è stato aggiunto alla classe BaseException, consentendo di allegare una nota di testo all'eccezione, ad esempio aggiungendo informazioni contestuali che non sono disponibili quando viene lanciata l'eccezione.
  • Aggiunto un tipo Self speciale per rappresentare l'attuale classe privata. Self può essere utilizzato per annotare metodi che restituiscono un'istanza della sua classe in un modo più semplice rispetto all'utilizzo di TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Aggiunto un tipo LiteralString speciale che può includere solo valori letterali stringa compatibili con il tipo LiteralString (ovvero stringhe semplici e LiteralString, ma non stringhe str arbitrarie o combinate). Il tipo LiteralString può essere utilizzato per limitare il passaggio di argomenti di stringa a funzioni, la sostituzione arbitraria di parti di stringhe in cui possono portare a vulnerabilità, ad esempio durante la generazione di stringhe per query SQL o comandi di 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" + letterale_stringa) # ok run_query(arbitrary_string) # Errore run_query( # Errore f"SELECT * FROM studenti WHERE nome = {arbitrary_string}" )
  • È stato aggiunto il tipo TypeVarTuple, consentendo l'uso di variabili generiche, a differenza di TypeVar, che copre non un tipo, ma un numero arbitrario di tipi.
  • La libreria standard include il modulo tomllib con funzioni per l'analisi del formato TOML.
  • È possibile contrassegnare singoli elementi dei dizionari digitati (TypedDict) con le etichette Obbligatorio e NotRequired per determinare i campi obbligatori e facoltativi (per impostazione predefinita, tutti i campi dichiarati sono obbligatori se il parametro totale non è impostato su False). class Film(TypedDict): titolo: str anno: NotRequired[int] m1: Film = {"titolo": "Pantera Nera", "anno": 2018} # OK m2: Film = {"titolo": "Star Wars" } # OK (il campo anno è facoltativo) m3: Film = {“anno”: 2022} # Errore, il campo titolo obbligatorio non è compilato)
  • La classe TaskGroup è stata aggiunta al modulo asyncio con l'implementazione di un gestore di contesto asincrono che attende il completamento di un gruppo di attività. L'aggiunta di attività a un gruppo viene eseguita utilizzando il metodo create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Entrambe le attività sono state completate ora .")
  • Aggiunto il decoratore @dataclass_transform per classi, metodi e funzioni, quando specificato, il sistema di controllo del tipo statico tratta l'oggetto come se utilizzasse il decoratore @dataclasses.dataclass. Nell'esempio seguente, la classe CustomerModel, durante il controllo dei tipi, verrà elaborata in modo simile a una classe con il decoratore @dataclasses.dataclass, ovvero come se avesse un metodo __init__ che accetta variabili id ​​e nome. @dataclass_transform() classe ModelBase: ... classe CustomerModel(ModelBase): id: int nome: str
  • Nelle espressioni regolari è stata aggiunta la possibilità di utilizzare il raggruppamento atomico ((?>...)) e i quantificatori possessivi (*+, ++, ?+, {m,n}+).
  • Aggiunta l'opzione della riga di comando "-P" e la variabile di ambiente PYTHONSAFEPATH per disabilitare l'allegato automatico di percorsi di file potenzialmente non sicuri a sys.path.
  • L'utilità py.exe per la piattaforma Windows è stata notevolmente migliorata, aggiungendo il supporto per la sintassi "-V:". / " inoltre "- . "
  • Molte macro nell'API C vengono convertite in funzioni inline regolari o statiche.
  • I moduli uu, cgi, pipe, crypt, aifc, Chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev e sunau sono stati deprecati e verranno rimossi in Python Versione 3.13. Rimosse le funzioni PyUnicode_Encode*.

Fonte: opennet.ru

Aggiungi un commento