Uscita del linguaggio di programmazione Python 3.11

Dopo un anno di sviluppo, è stata pubblicata una significativa versione del linguaggio di programmazione Python 3.11. Questo ramo sarà supportato per un anno e mezzo, dopodiché riceverà correzioni per vulnerabilità per altri tre anni e mezzo.

Contemporaneamente è iniziato il test alpha del ramo Python 3.12 (secondo il nuovo piano di sviluppo, il lavoro su un nuovo ramo inizia cinque mesi prima del rilascio del ramo precedente e, al momento del rilascio, raggiunge la fase di test alpha). Il ramo Python 3.12 sarà in fase di release alpha per sette mesi, durante i quali verranno aggiunte nuove funzionalità e si procederà alla correzione di errori. Successivamente, ci saranno tre mesi di test beta, durante i quali l'aggiunta di nuove funzionalità sarà vietata e tutto l'attenzione si concentrerà sulla correzione di errori. Gli ultimi due mesi prima del rilascio il ramo sarà in fase di candidato per il rilascio, durante la quale sarà effettuata la stabilizzazione finale.

Tra le novità introdotte in Python 3.11 ci sono:

  • È stato effettuato un lavoro significativo per ottimizzare le prestazioni. Il nuovo ramo include modifiche relative all'accelerazione e al deployment inline delle chiamate di funzione, all'uso di interpreti rapidi per operazioni comuni (x+x, x*x, x-x, a[i], a[i] = z, f(arg), C(arg), o.method(), o.attr = z, *seq), e a ottimizzazioni sviluppate dai progetti Cinder e HotPy. A seconda del tipo di carico, si osserva un aumento della velocità di esecuzione del codice dal 10% al 60%. In media, le prestazioni durante il passaggio del set di test pyperformance sono aumentate del 25%.

    Rivisitato il meccanismo di cache del bytecode, che ha permesso di ridurre il tempo di avvio dell'interprete del 10-15%. Gli oggetti con bytecode e codice ora sono allocati staticamente dall'interprete, permettendo di eliminare le fasi di demarshalling del bytecode estratto dalla cache e la conversione degli oggetti contenenti codice per l'allocazione in memoria dinamica.

  • Durante la visualizzazione dello stack trace nei messaggi diagnostici, ora viene fornita l'informazione sull'espressione che ha causato l'errore (in precedenza veniva evidenziata solo la riga senza dettagli su quale parte della riga avesse causato l'errore). Ulteriori informazioni sullo stack trace possono anche essere ottenute tramite API e utilizzate per mappare singole istruzioni di bytecode a posizioni specifiche nel codice sorgente, utilizzando il metodo codeobject.co_positions() o la funzione C API PyCode_Addr2Location(). Questo cambiamento semplifica notevolmente il debug di problemi legati a oggetti annidati nei dizionari, chiamate multiple di funzioni e espressioni aritmetiche complesse. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero.
  • Aggiunta la gestione dei gruppi di eccezioni, che consente al programma di generare e gestire più eccezioni diverse simultaneamente. Per raggruppare più eccezioni e chiamarle insieme, sono stati introdotti nuovi tipi di eccezioni ExceptionGroup e BaseExceptionGroup, e per l'estrazione di singole eccezioni dal gruppo è stata aggiunta l'espressione «except*».
  • Nel classe BaseException è stato aggiunto il metodo add_note(), che consente di allegare un testo di nota all'eccezione, ad esempio, per aggiungere informazioni contestuali non disponibili al momento della generazione dell'eccezione.
  • Aggiunto un tipo speciale Self, che rappresenta il classe corrente. Self può essere utilizzato per annotare metodi che restituiscono un'istanza della propria classe, in un modo più semplice rispetto all'uso di TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Aggiunto un tipo speciale LiteralString, che può includere solo stringhe letterali, compatibili con il tipo LiteralString (cioè 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 a funzioni, dove la sostituzione arbitraria di parti delle stringhe può portare a vulnerabilità, ad esempio durante la creazione 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 di utilizzare generics variabili, a differenza di TypeVar, coprendo non un solo tipo, ma un numero arbitrario di tipi.
  • Nella libreria standard è stato aggiunto il modulo tomllib con funzioni per il parsing del formato TOML.
  • È stata introdotta la possibilità di contrassegnare singoli elementi di dizionari tipizzati (TypedDict) con etichette Required e NotRequired per definire i campi obbligatori e facoltativi (per impostazione predefinita, tutti i campi dichiarati sono obbligatori se il parametro total non è 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 year è facoltativo) m3: Movie = {"year": 2022} # Errore, non è stato compilato il campo obbligatorio title)
  • Nel modulo asyncio è stata aggiunta la classe TaskGroup con l'implementazione di un gestore di contesto asincrono che attende il completamento di un gruppo di attività. L'aggiunta di attività al gruppo avviene tramite 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 terminate ora.")
  • È stato aggiunto il decoratore per classi, metodi e funzioni @dataclass_transform, per il quale il sistema di controllo dei tipi statici interpreta l'oggetto come se fosse utilizzato il decoratore @dataclasses.dataclass. Nell'esempio seguente, la classe CustomerModel verrà elaborata in modo simile a una classe con il decoratore @dataclasses.dataclass, cioè come se avesse un metodo __init__, che accetta le variabili id e name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • È stata aggiunta la possibilità di usare raggruppamenti atomici ((?>(…)) e quantificatori possessivi (*+, ++, ?+, {m,n}+).
  • È stata aggiunta l'opzione della riga di comando «-P» e la variabile d'ambiente PYTHONSAFEPATH per disabilitare l'allegato automatico a sys.path di percorsi di file potenzialmente non sicuri.
  • È stata notevolmente migliorata l'utilità py.exe per la piattaforma Windows, che ora supporta la sintassi «-V:/» oltre a «-.».
  • Molti macro nell'API C sono stati convertiti in normali funzioni inline statiche.
  • Sono stati dichiarati obsoleti e verranno rimossi nella versione Python 3.13 i moduli uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev e sunau. Sono state rimosse le funzioni PyUnicode_Encode*.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster