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à.
Contemporaneamente, il ramo Python 3.12 ha iniziato la fase di test alpha (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 entro la data del rilascio successivo). Il ramo Python 3.12 rimarrà in fase di rilascio alpha per sette mesi, durante i quali verranno aggiunte nuove funzionalità e corretti bug. Successivamente, verrà condotta una fase di beta testing per tre mesi, durante i quali sarà vietata l'aggiunta di nuove funzionalità e verrà prestata la massima attenzione alla correzione dei bug. Negli ultimi due mesi prima del rilascio, il ramo sarà in fase di release candidate, durante la quale verrà eseguita la stabilizzazione finale.
Le nuove aggiunte a Python 3.11 includono:
- Sono stati completati significativi lavori di ottimizzazione delle prestazioni. Il nuovo ramo include modifiche relative all'accelerazione e all'espansione inline delle chiamate di funzione, all'uso di interpreti veloci per operazioni tipiche (x+x, x*x, xx, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq) e ottimizzazioni preparate dai progetti Cinder e HotPy. A seconda del tipo di carico di lavoro, la velocità di esecuzione del codice è aumentata del 10-60%. In media, le prestazioni durante l'esecuzione della suite di benchmark 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 di codice e il bytecode vengono ora allocati staticamente dall'interprete, eliminando i passaggi di demarshalling del bytecode recuperato dalla cache e di conversione degli oggetti di codice per la memoria dinamica.
- Quando si visualizzano le tracce delle chiamate nei messaggi di diagnostica, ora vengono visualizzate informazioni sull'espressione che ha causato l'errore (in precedenza, veniva evidenziata solo la riga senza specificare quale parte della riga avesse causato l'errore). Informazioni di traccia estese possono anche essere ottenute tramite l'API e utilizzate per mappare singole istruzioni bytecode a una posizione specifica nel codice sorgente utilizzando il metodo codeobject.co_positions() o la funzione API C PyCode_Addr2Location(). Questa modifica semplifica notevolmente i problemi di debug relativi a oggetti dizionario annidati, chiamate di funzioni multiple ed espressioni aritmetiche complesse. Traceback (ultima chiamata più recente): File "calculation.py", riga 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: divisione per zero
- È stato aggiunto il supporto per i gruppi di eccezioni, consentendo al programma di generare e gestire più eccezioni diverse contemporaneamente. Sono disponibili nuovi tipi di eccezione, ExceptionGroup e BaseExceptionGroup, per raggruppare più eccezioni e generarle insieme, ed è stata aggiunta l'espressione "except*" per selezionare singole eccezioni da un gruppo.
- Il metodo add_note() è stato aggiunto alla classe BaseException, consentendo di allegare una nota di testo a un'eccezione, ad esempio per aggiungere informazioni di contesto che non erano disponibili al momento in cui è stata generata l'eccezione.
- È stato aggiunto un tipo speciale, Self, che rappresenta la classe chiusa corrente. Self può essere utilizzato per annotare metodi che restituiscono un'istanza della sua classe, più facilmente rispetto all'utilizzo di TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- È stato aggiunto uno speciale tipo LiteralString che può contenere solo stringhe letterali compatibili con il tipo LiteralString (ovvero stringhe semplici e stringhe di tipo LiteralString, ma non stringhe arbitrarie o combinate di tipo str). Il tipo LiteralString può essere utilizzato per limitare il passaggio di argomenti stringa alle funzioni, dove la sostituzione arbitraria di parti di stringa potrebbe portare a vulnerabilità, ad esempio durante la generazione di stringhe per query SQL o comandi 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) # Errore run_query( # Errore f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Aggiunto il tipo TypeVarTuple, che consente l'uso di generici variadici che, a differenza di TypeVar, coprono non un tipo, ma un numero arbitrario di tipi.
- La libreria standard include il modulo tomllib con funzioni per l'analisi del formato TOML.
- Ora è possibile contrassegnare singoli elementi dei dizionari tipizzati (TypedDict) con etichette Required e NotRequired per determinare se i campi sono obbligatori o meno (per impostazione predefinita, tutti i campi dichiarati sono obbligatori a meno che il parametro total non sia impostato su False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars"} # OK (il campo anno è facoltativo) m3: Movie = {"year": 2022} # Errore, il campo titolo obbligatorio non è compilato)
- Il modulo asyncio ora include una classe TaskGroup. Questa classe implementa un gestore di contesto asincrono che attende il completamento di un gruppo di attività. Le attività vengono aggiunte al gruppo 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.")
- È stato aggiunto il decoratore @dataclass_transform per classi, metodi e funzioni. Quando specificato, fa sì che il sistema di controllo dei tipi statico tratti un oggetto come se utilizzasse il decoratore @dataclasses.dataclass. Nell'esempio seguente, la classe CustomerModel verrà trattata durante il controllo dei tipi in modo simile a una classe con decoratore @dataclasses.dataclass, ovvero come se avesse un metodo __init__ che accetta le variabili id e name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- Le espressioni regolari ora supportano 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'associazione automatica di percorsi di file potenzialmente non sicuri a sys.path.
- L'utility py.exe per la piattaforma è stata notevolmente migliorata. Windows, che implementa il supporto per la sintassi "-V:". / " inoltre "- . "
- Molte macro nell'API C sono state convertite in funzioni inline normali o statiche.
- I seguenti moduli sono stati deprecati e saranno rimossi in Python 3.13: uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev e sunau. Le funzioni PyUnicode_Encode* sono state rimosse.
Fonte: opennet.ru
