Dopo un anno di sviluppo, è stato presentato un importante rilascio del linguaggio di programmazione Python 3.10. Questo nuovo ramo sarà supportato per un anno e mezzo, dopodiché per ulteriori tre anni e mezzo saranno forniti aggiornamenti per risolvere vulnerabilità.
Contemporaneamente è iniziato il collaudo alfa del ramo Python 3.11 (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 collaudo alfa al momento del rilascio successivo). Il ramo Python 3.11 sarà in fase di rilasci alfa per sette mesi, durante i quali saranno aggiunte nuove funzionalità e sarà effettuata la correzione di bug. Successivamente, per tre mesi si svolgerà la fase di collaudo delle versioni beta, durante la quale sarà vietato aggiungere nuove funzionalità e l'attenzione sarà rivolta esclusivamente alla correzione degli errori. Gli ultimi due mesi prima del rilascio, il ramo sarà in fase di candidato a rilascio, durante la quale verrà effettuata la stabilizzazione finale.
Tra le novità introdotte in Python 3.10:
- Sono stati implementati gli operatori «match» e «case» per il pattern matching, che migliorano la leggibilità del codice, semplificano il confronto di oggetti Python arbitrari e aumentano l'affidabilità del codice grazie alla possibilità di un'analisi statica avanzata dei tipi. La realizzazione ricorda molto l'operatore «match» fornito nei linguaggi Scala, Rust e F#, che confronta il risultato di un'espressione specificata con un elenco di pattern elencati nei blocchi basati sull'operatore «case».
def http_error(status): match status: case 400: return «Bad request» case 401|403|404: return «Not allowed» case 418: return «I’m a teapot» case _: return «Something else»
È possibile decompattare oggetti, tuple, elenchi e sequenze arbitrarie per legare variabili in base ai valori esistenti. È consentita la definizione di modelli annidati, l'uso di condizioni aggiuntive "if" nei modelli, l'applicazione di maschere ("[x, y, *rest]"), il mapping di associazioni chiave/valore (ad esempio, {"bandwidth": b, "latency": l} per estrarre i valori "bandwidth" e "latency" da un dizionario), l'estrazione di sotto-modelli (operatore ":="), e l'uso di costanti nominate nel modello. Nelle classi, è possibile configurare il comportamento durante il matching tramite il metodo "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origine") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Altrove") case _: print("Non è un punto") match point: case Point(x, y) if x == y: print(f"Y=X in {x}") case Point(x, y): print(f"Non sulla diagonale") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Vedo rosso!") case GREEN: print("L'erba è verde") case BLUE: print("Mi sento giù :(")
- È stata introdotta la possibilità di utilizzare le parentesi tonde nell'operatore with per distribuire su più righe la definizione delle collezioni di gestori di contesto. È inoltre consentito lasciare una virgola dopo l'ultimo gestore di contesto nel gruppo: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- È stato migliorato l'informativo sulla posizione nel codice riguardo agli errori legati a parentesi graffe e virgolette non chiuse nelle stringhe letterali. Ad esempio, se una parentesi graffa non è chiusa, anziché fornire un errore di sintassi nella costruzione successiva, il puntatore ora evidenzia la parentesi graffa aperta e informa dell'assenza del blocco di chiusura. File «example.py», line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ was never closed
Sono stati aggiunti messaggi di errore di sintassi specializzati: assenza del simbolo ':' prima di un blocco e nei dizionari, mancata delimitazione delle tuple tra parentesi, assenza di una virgola nelle liste, dichiarazione di un blocco 'try' senza 'except' e 'finally', uso di '=' invece di '==' nei confronti, e indicazione di espressioni *- nelle f-string. Inoltre, è stato garantito che l'intera espressione problematica venga evidenziata e che ci sia una comunicazione più chiara del contesto degli errori legati a un'errata indentazione. >>> def foo(): … if lel: … x = 2 File '', line 3 x = 2 ^ IndentationError: blocco indentato atteso dopo l'istruzione 'if' nella riga 2
Negli errori causati da errori di battitura nei nomi degli attributi e delle variabili nella funzione, è stato fornito un suggerimento con il nome corretto. >>> collections.namedtoplo Traceback (most recent call last): File '', line 1, in AttributeError: il modulo 'collections' non ha l'attributo 'namedtoplo'. Vuoi dire: namedtuple?
- Per gli strumenti di debug e i profiler, è stato fornito l'indicatore nei log di tracing dei numeri di riga esatti del codice eseguito.
- È stata aggiunta l'impostazione sys.flags.warn_default_encoding per visualizzare un avviso su potenziali errori riguardanti la gestione in TextIOWrapper e open() di file in codifica UTF-8 senza specificare esplicitamente l'opzione ‘encoding="utf-8"‘ (per impostazione predefinita viene utilizzata la codifica ASCII). Inoltre, nella nuova versione è stata fornita la possibilità di specificare il valore ‘encoding="locale"‘ per impostare la codifica in base alla locale attuale.
- Nel modulo typing, che fornisce strumenti per le annotazioni sui tipi, è stato aggiunto un nuovo operatore che consente di utilizzare la sintassi «X | Y» per scegliere uno dei tipi (tipo X o tipo Y). def square(number: int | float) -> int | float: return number ** 2 è equivalente alla costruzione precedentemente supportata: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Nel modulo typing è stato aggiunto l'operatore Concatenate e la variabile ParamSpec, che consentono di passare informazioni aggiuntive per il controllo statico dei tipi quando si utilizza Callable. Sono stati inoltre aggiunti valori speciali TypeGuard per annotare funzioni di protezione dei tipi e TypeAlias per definire esplicitamente un alias di tipo. StrCache: TypeAlias = ‘Cache[str]’ # un alias di tipo
- Nella funzione zip() è stato implementato un flag opzionale "strict", che, se specificato, verifica che gli argomenti da iterare abbiano la stessa lunghezza. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2), ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (most recent call last): ... ValueError: l'argomento 2 di zip() è più lungo dell'argomento 1
- Sono state introdotte nuove funzioni integrate aiter() e anext() che implementano analoghi asincroni delle funzioni iter() e next().
- La prestazione dei costruttori str(), bytes() e bytearray() è stata accelerata del 30-40% durante l'elaborazione di piccoli oggetti.
- Il numero di operazioni di importazione nel modulo runpy è stato ridotto. Il comando "python3 -m nome_modulo" viene ora eseguito in media 1,4 volte più velocemente grazie alla riduzione dei moduli importati da 69 a 51.
- Nell'istruzione LOAD_ATTR è stato attivato un meccanismo di caching per singoli opcode, che ha consentito di accelerare l'operazione con attributi normali fino al 36%, e con slot fino al 44%.
- Durante la compilazione di Python con l'opzione "--enable-optimizations", ora viene attivata la modalità "-fno-semantic-interposition", che rispetto alla compilazione con l'opzione "--enable-shared" consente di accelerare il funzionamento dell'interprete fino al 30%.
- Nei moduli hashlib e ssl È stata aggiunta la supporto per OpenSSL 3.0.0 ed è stata interrotta la supporto per le versioni di OpenSSL precedenti alla 1.1.1.
- È stato rimosso il vecchio parser, sostituito dalla parser PEG (Parsing Expression Grammar) nella versione precedente. Il modulo formatter è stato eliminato. È stato rimosso il parametro loop dall'API asyncio. Sono stati rimossi metodi precedentemente dichiarati obsoleti. Sono state eliminate funzioni Py_UNICODE_str*, che manipolano le stringhe Py_UNICODE*.
- Il modulo distutils è stato dichiarato obsoleto ed è previsto per essere rimosso in Python 3.12. Si raccomanda di utilizzare al suo posto i moduli setuptools, packaging, platform, shutil, subprocess e sysconfig. La struttura wstr in PyUnicodeObject è stata anche classificata come obsoleta e destinata alla rimozione.
Fonte: opennet.ru
