Rilascio del linguaggio di programmazione Python 3.10

Dopo un anno di sviluppo viene presentata l'importante release del linguaggio di programmazione Python 3.10. 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.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 test alpha al momento del rilascio successivo ). Il ramo Python 3.11 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.10 includono:

  • Operatori "match" e "case" implementati per la corrispondenza dei modelli, che migliorano la leggibilità del codice, semplificano la corrispondenza di oggetti Python arbitrari e aumentano l'affidabilità del codice attraverso il controllo avanzato del tipo statico. L'implementazione è molto simile all'operatore "match" fornito in Scala, Rust e F#, che confronta il risultato di un'espressione specificata con un elenco di modelli elencati in blocchi in base all'operatore "case".

    def http_error(status): match status: case 400: return “Richiesta errata” case 401|403|404: return “Non consentito” case 418: return “Sono una teiera” case _: return “Qualcos'altro”

    Puoi decomprimere oggetti, tuple, elenchi e sequenze arbitrarie per associare variabili in base a valori esistenti. È consentito definire modelli nidificati, utilizzare condizioni "if" aggiuntive nel modello, utilizzare maschere ("[x, y, *rest]"), mappature chiave/valore (ad esempio, {"bandwidth": b, "latency ”: l} per estrarre i valori di "larghezza di banda" e "latenza" da un dizionario), estrarre modelli secondari (":=" operatore), utilizzare costanti con nome in un modello. Nelle classi è possibile personalizzare il comportamento di abbinamento utilizzando il metodo “__match__()”.

    from dataclasses import dataclass @dataclass class Punto: x: int y: int def whereis(punto): match punto: case Punto(0, 0): print("Origine") case Punto(0, y): print(f" Y={y}") case Punto(x, 0): print(f"X={x}") case Punto(): print("Da qualche altra parte") case _: print("Non un punto") match punto: case Punto(x, y) if x == y: print(f"Y=X at {x}") case Punto(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 triste :(")

  • È ora possibile utilizzare le parentesi nell'istruzione with per dividere la definizione di una raccolta di gestori di contesto su più righe. È inoltre consentito lasciare una virgola dopo il gestore di contesto finale nel gruppo: with ( CtxManager1() come esempio1, CtxManager2() come esempio2, CtxManager3() come esempio3, ): ...
  • Segnalazione migliorata della posizione del codice degli errori relativi alle parentesi graffe e alle virgolette non chiuse nelle stringhe letterali. Ad esempio, quando è presente una parentesi graffa aperta, invece di segnalare un errore di sintassi nel costrutto seguente, il puntatore ora evidenzia la parentesi graffa di apertura e indica che non è presente alcun blocco di chiusura. File "example.py", riga 1 prevista = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' non è mai stato chiuso

    Aggiunti ulteriori messaggi di errore di sintassi specializzati: simbolo ":" mancante prima di un blocco e nei dizionari, non separare una tupla con parentesi, manca una virgola negli elenchi, specificare un blocco "provare" senza "eccetto" e "finalmente", utilizzando "= " invece di "= =" nei confronti, specificando *-expressions in f-strings. Inoltre, garantisce che venga evidenziata l'intera espressione problematica, non solo l'inizio, e informazioni più esplicite sul contesto degli errori associati al rientro errato. >>> def foo(): ... if lel: ... x = 2 File " ", riga 3 x = 2 ^ IndentationError: previsto un blocco rientrato dopo l'istruzione 'if' nella riga 2

    In caso di errori causati da errori di battitura nei nomi degli attributi e dei nomi delle variabili in una funzione, viene emessa una raccomandazione con il nome corretto. >>>collections.namedtoplo Traceback (ultima chiamata più recente): File « ", riga 1, in AttributeError: il modulo 'collections' non ha l'attributo 'namedtoplo'. Forse intendi: nametuple?

  • Per gli strumenti di debug e i profiler, gli eventi di traccia vengono forniti con i numeri esatti di riga del codice eseguito.
  • Aggiunta l'impostazione sys.flags.warn_default_encoding per visualizzare un avviso sui potenziali errori associati a TextIOWrapper e open() che elaborano file con codifica UTF-8 senza specificare esplicitamente l'opzione 'encoding=»utf-8″' (la codifica ASCII viene utilizzata per impostazione predefinita) . La nuova versione offre inoltre la possibilità di specificare un valore 'encoding="locale"' per impostare la codifica in base alla locale corrente.
  • È stato aggiunto un nuovo operatore al modulo di digitazione, che fornisce strumenti per specificare annotazioni di tipo, consentendo l'uso della sintassi “X | Y" per selezionare uno dei tipi (tipo X o tipo Y). def quadrato(numero: int | float) -> int | float: return numero ** 2 è equivalente al costrutto precedentemente supportato: def quadrato(numero: Union[int, float]) -> Union[int, float]: return numero ** 2
  • Al modulo di digitazione sono stati aggiunti l'operatore Concatenate e la variabile ParamSpec, che consentono di passare informazioni aggiuntive per il controllo del tipo statico quando si utilizza Callable. Il modulo di digitazione aggiunge anche valori speciali TypeGuard per annotare le funzioni di protezione del tipo e TypeAlias ​​per definire esplicitamente un alias di tipo. StrCache: TypeAlias ​​= 'Cache[str]' # un alias di tipo
  • La funzione zip() implementa un flag opzionale “strict” che, quando specificato, controlla se gli argomenti iterati hanno la stessa lunghezza. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=Vero)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (ultima chiamata più recente ): … ValueError: l'argomento 2 di zip() è più lungo dell'argomento 1
  • Vengono proposte nuove funzioni built-in aiter() e anext() con l'implementazione di analoghi asincroni alle funzioni iter() e next().
  • Il lavoro dei costruttori str(), bytes() e bytearray() quando si lavora con piccoli oggetti è stato accelerato del 30-40%.
  • Ridotto il numero di operazioni di importazione nel modulo runpy. Il comando "python3 -m module_name" ora viene eseguito in media 1.4 volte più velocemente grazie alla riduzione dei moduli importati da 69 a 51.
  • L'istruzione LOAD_ATTR utilizza un meccanismo di memorizzazione nella cache per i singoli codici operativi, che ha consentito di accelerare il lavoro con attributi regolari fino al 36% e con slot fino al 44%.
  • Quando si compila Python con l'opzione “--enable-optimizations”, ora è abilitata la modalità “-fno-semantic-interposition”, che consente di velocizzare l'interprete fino al 30% rispetto alla compilazione con “--enable-shared” " opzione.
  • I moduli hashlib e ssl hanno aggiunto il supporto per OpenSSL 3.0.0 e hanno smesso di supportare le versioni OpenSSL precedenti alla 1.1.1.
  • È stato rimosso il vecchio parser, sostituito nel ramo precedente dal parser PEG (Parsing Expression Grammar). Il modulo formattatore è stato rimosso. Il parametro loop è stato rimosso dall'API asyncio. I metodi precedentemente deprecati sono stati rimossi. Le funzioni Py_UNICODE_str* che manipolano le stringhe Py_UNICODE* sono state rimosse.
  • Il modulo distutils è stato deprecato e la sua rimozione è prevista in Python 3.12. Invece di distutils, si consiglia di utilizzare i moduli setuptools, packaging, platform, shutil, subprocess e sysconfig. La struttura wstr in PyUnicodeObject è stata deprecata e ne è stata pianificata la rimozione.

Fonte: opennet.ru

Aggiungi un commento