Rilascio del linguaggio di programmazione Python 3.10

Dopo un anno di sviluppo, è stata presentata una significativa versione del linguaggio di programmazione Python 3.10. Il nuovo ramo sarà supportato per un anno e mezzo, dopodiché riceverà correzioni per le vulnerabilità per altri tre anni e mezzo.

Contemporaneamente è iniziato il testing alpha 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 al momento del successivo rilascio raggiunge la fase di testing alpha). Il ramo Python 3.11 sarà in fase di rilasci alpha per sette mesi, durante i quali verranno aggiunte nuove funzionalità e corretti bug. Dopo di ciò, ci saranno tre mesi di testing delle versioni beta, durante i quali non sarà consentito l'aggiunta di nuove funzionalità e l'attenzione sarà rivolta esclusivamente alla correzione dei bug. Gli ultimi due mesi prima del rilascio il ramo sarà in fase di candidatura al 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 matching dei pattern, che migliorano la leggibilità del codice, semplificano il matching di oggetti Python arbitrari e aumentano l'affidabilità del codice grazie alla possibilità di una verifica statica dei tipi estesa. L'implementazione ricorda molto l'operatore «match» presente nei linguaggi Scala, Rust e F#, che esegue un confronto tra il risultato dell'esecuzione di un'espressione specificata e un elenco di pattern elencati nei blocchi basati sull'operatore «case».

    def http_error(status): match status: case 400: return «Richiesta non valida» case 401|403|404: return «Non consentito» case 418: return «Sono una teiera» case _: return «Qualcos'altro»

    È possibile decomprimere oggetti, tuple, liste e sequenze arbitrarie per il binding delle variabili in base ai valori esistenti. È consentita la definizione di template nidificati, l'uso di condizioni aggiuntive "if" nei template, l'applicazione di maschere ("[x, y, *rest]"), il mapping di coppie chiave/valore (ad esempio, {"bandwidth": b, "latency": l} per estrarre i valori "bandwidth" e "latency" da un dizionario), l'estrazione di sottotemplate (operatore ":=") e l'uso di costanti nominate nel template. Nelle classi, è possibile configurare il comportamento durante il matching utilizzando 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("Qualcos'altro") case _: print("Non è un punto") match point: case Point(x, y) if x == y: print(f"Y=X a {x}") case Point(x, y): print(f"Non sulla diagonale") ROSSO, VERDE, BLU = 0, 1, 2 match color: case ROSSO: print("Vedo rosso!") case VERDE: print("L'erba è verde") case BLU: print("Mi sento giù :( ")

  • È stata fornita la possibilità di utilizzare le parentesi tonde nell'operatore with per suddividere su più righe la definizione di una collezione di gestori di contesto. È anche consentito lasciare una virgola dopo l'ultimo gestore di contesto nel gruppo: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
  • È migliorata l'informazione sulla posizione nel codice degli errori legati a parentesi graffe e virgolette non chiuse nei letterali di stringa. Ad esempio, quando manca una parentesi graffa chiusa, invece di segnalare un errore di sintassi nella costruzione successiva, il puntatore ora evidenzia la parentesi graffa aperta e informa della mancanza 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

    Aggiunte ulteriori segnalazioni specializzate sugli errori di sintassi: assenza del simbolo «:» prima del blocco e nei dizionari, mancata delimitazione della tupla tra parentesi, assenza della virgola nelle liste, indicazione del blocco «try» senza «except» e «finally», uso di «=» invece di «==» nei confronti, indicazione di espressioni * in f-string. Inoltre, ora è evidenziata l'intera espressione problematica e non solo l'inizio, con un'informazione più chiara sul contesto degli errori legati a errata indentazione. >>> def foo(): … if lel: … x = 2 File «», line 3 x = 2 ^ IndentationError: atteso un blocco indentato dopo l'istruzione 'if' nella riga 2

    Negli errori causati da errori di battitura nel nome degli attributi e nei nomi delle variabili nella funzione, viene fornita una raccomandazione con il nome corretto. >>> collections.namedtoplo Traceback (most recent call last): File «», line 1, in AttributeError: il modulo ‘collections’ non ha l'attributo ‘namedtoplo’. Volevi dire: namedtuple?

  • Per gli strumenti di debug e i profiler è garantita l'indicazione nei eventi di tracciamento dei numeri di riga esatti del codice eseguito.
  • Aggiunta la configurazione sys.flags.warn_default_encoding per emettere avvisi su potenziali errori legati all'elaborazione 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). Nel nuovo rilascio è anche fornita la possibilità di specificare il valore ‘encoding=»locale»‘ per impostare la codifica in base alla localizzazione corrente.
  • Nel modulo typing, che fornisce strumenti per la definizione delle annotazioni di tipo, è stato aggiunto un nuovo operatore che consente di utilizzare la sintassi «X | Y» per selezionare 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 durante l'uso di Callable. Nel modulo typing sono stati inoltre aggiunti i valori speciali TypeGuard per annotare le 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 facoltativo «strict», il cui utilizzo comporta una verifica della stessa lunghezza degli argomenti iterabili. >>> 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: il secondo argomento di zip() è più lungo del primo
  • Sono state proposte nuove funzioni integrate aiter() e anext() che implementano analoghi asincroni delle funzioni iter() e next().
  • L'esecuzione dei costruttori str(), bytes() e bytearray() è stata accelerata del 30-40% durante la gestione di piccoli oggetti.
  • È stato ridotto il numero di operazioni di importazione nel modulo runpy. Il comando «python3 -m nome_modulo» ora si avvia in media 1.4 volte più velocemente grazie alla riduzione dei moduli importati da 69 a 51.
  • Nel comando LOAD_ATTR è stato attivato un meccanismo di caching per singoli opcode, che ha consentito di accelerare l'interazione con i normali attributi fino al 36% e con gli slot fino al 44%.
  • Nella compilazione di Python con l'opzione «--enable-optimizations» ora viene attivata la modalità «-fno-semantic-interposition», che consente di accelerare l'esecuzione dell'interprete fino al 30% rispetto alla compilazione con l'opzione «--enable-shared».
  • Nei moduli hashlib e ssl è stata aggiunta la compatibilità con OpenSSL 3.0.0 ed è stata interrotta la compatibilità con le versioni OpenSSL precedenti alla 1.1.1.
  • È stato rimosso il vecchio parser, sostituito dal parser PEG (Parsing Expression Grammar) nella versione precedente. È stato rimosso il modulo formatter. Dal API asyncio è stato rimosso il parametro loop. Sono stati rimossi i metodi precedentemente dichiarati obsoleti. Sono state rimosse le funzioni Py_UNICODE_str*, che manipolano le stringhe Py_UNICODE*.
  • È stato dichiarato obsoleto il modulo distutils, previsto per la rimozione in Python 3.12. Si consiglia di utilizzare i moduli setuptools, packaging, platform, shutil, subprocess e sysconfig al posto di distutils. La struttura wstr in PyUnicodeObject è stata anche dichiarata obsoleta e destinata alla rimozione.

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