Novità in Python 3.12 – Caratteristiche, Aggiornamenti e Miglioramenti

Le Nuove Funzionalità di Python 3.12 - Caratteristiche, Aggiornamenti e Miglioramenti

Python, un linguaggio dinamico noto per la sua leggibilità, versatilità e forte community, ha ancora una volta lasciato il segno con la nuova versione 3.12 rilasciata il 2 ottobre. Con numerosi miglioramenti e nuove funzionalità, contributori di tutto il mondo hanno aiutato Python a fare un altro grande passo avanti. Se sei curioso delle ultime novità di questo linguaggio, allora questo articolo è per te.

Python rilascia nuove versioni ogni anno, con una versione beta bloccata all’inizio dell’anno e una versione ufficiale alla fine dell’anno.

Versioni di Python

Senza perdere tempo, vediamo i miglioramenti di questa versione.

Messaggi di errore migliorati

Python inizia a dare suggerimenti agli utenti per eventuali errori di battitura, una novità per questo linguaggio. Inoltre, ecco alcune nuove funzionalità:

  • I moduli che dimentichiamo di importare nel nostro codice vengono suggeriti nella nuova versione come parte del messaggio di errore.

  • In caso di errori di battitura nel nome di variabile o di funzione, vengono forniti suggerimenti nell’errore NameError.

  • Le eccezioni di ImportError sollevate da dichiarazioni fallite from <module> import <name> ora includono suggerimenti per il valore di <name> basati sui nomi potenzialmente disponibili in <module>.

  • I messaggi di errore di sintassi si sono migliorati quando l’utente digita import x from y invece di from x import y.

  • I suggerimenti di NameError ora includono self. aggiunto al nome quando viene sollevato all’interno di un’istanza di classe (ad esempio, name 'name' non è definito. Intendevi 'self.name'?). Questo perché omettere self, ad esempio, per le variabili, è una fonte comune di errori nelle istanze di classe.

Miglioramenti di F-String

F-String (Formatted Strings) sono stati introdotti per la prima volta in Python 3.6. Sono il modo comodo di Python per formattare le stringhe. Nelle versioni precedenti, erano fortemente limitati nel modo in cui potevano essere formattati. Ma in 3.12, sono state eliminate alcune restrizioni.

  • Possiamo ora usare i segni di citazione per le stringhe (” o ’) all’interno di F-String, in modo indipendente da usi precedenti.
Utilizzo nelle versioni precedenti
Utilizzo nella versione 3.12
  • Le F-strings ora possono essere espressioni multilinea simili ad altre parentesi o virgolette (ad esempio, utilizzando le parentesi per consentire alle espressioni di occupare più righe).
  • Fino ad ora, gli caratteri Backslash (\) o Unicode non erano ammessi in F-Strings, ma la restrizione è stata eliminata.
Versione precedente
Versione 3.12
  • Gli errori all’interno delle espressioni f-string restituiscono ora la posizione esatta dell’errore all’interno dell’istruzione di chiusura, non solo all’interno dell’espressione stessa. Questo rende gli errori f-string più facili da individuare e risolvere.

Miglioramento nella digitazione

La sintassi dell’annotazione del tipo di Python è stata introdotta in Python 3.5, il che consente agli strumenti di linting di rilevare errori in anticipo. TypeDict è la nuova aggiunta.

from Typing import TypedDict, Unpackclass Employee(TypedDict):    name: str    id: intdef retrieve(**kwargs: Unpack[Employee]) -> None: ...

TypeDict viene utilizzato per suggerire gli argomenti delle parole chiave. Successivamente, viene utilizzato Unpack, aggiunto in versione 3.11, per scomporre il TypeDict.

Per le funzioni generiche in cui possiamo restituire diversi tipi di dati come output, viene utilizzata una variabile di tipo per l’annotazione.

def first[T](elements: list[T]) -> T:    return elements[0]

Nella funzione precedente, se viene passata una lista di interi, l’output sarà un intero. Se passiamo una lista di stringhe, l’output sarà una stringa. È importante notare che non è necessario dichiarare il Typing nell’esempio precedente.

Anche la verifica statica del tipo è stata migliorata nella versione recente. Per i metodi nelle classi figlie che sovrascrivono i metodi delle classi genitore, possiamo usare @override per consentire ai controllori di tipo di rilevare errori.

from typing import overrideclass Base:    def get_color(self) -> str:        return "blue"class GoodChild(Base):    @override  # Okay: overrides Base.get_color    def get_color(self) -> str:        return "yellow"

Comprensione dell’interruzione

Le comprensioni, una sintassi che consente di costruire rapidamente liste, dizionari e insiemi, non creano più un oggetto di funzione a uso singolo; ora sono costruite “in linea”. La velocità risultante è ora di circa il 11% per un caso reale e fino al doppio più veloce per un micro-benchmark.

Ora il processo di accelerazione avviene più velocemente rispetto alla versione 3.11. L’accelerazione è il processo di notare che un certo bytecode viene eseguito diverse volte, rendendolo candidato per la Specializzazione, mentre la specializzazione significa che l’interprete sostituisce un bytecode generale con uno specializzato.

Subinterpreters

Forniscono la capacità di avere più istanze di interprete, ognuna con la propria GIL, in esecuzione affiancate all’interno di un singolo processo Python. Questo costituirebbe un grande passo verso una migliore parallelismo in Python. Tuttavia, la versione 3.12 include solo le componenti interne di CPython per renderlo possibile. Non è ancora disponibile un’interfaccia per l’utente finale per i subinterpreters.

Supporto per il profiler perf di Linux

Lo strumento profiler Linux ampiamente utilizzato perf funziona con Python, ma restituisce solo informazioni su ciò che accade a livello C all’interno dell’ambiente di runtime di Python. Non vengono visualizzate informazioni sulle effettive funzioni di programma Python.

Python 3.12 abilita una modalità di attivazione facoltativa per consentire a perf di raccogliere dettagli sui programmi Python, non solo sull’ambiente di runtime. L’attivazione può essere effettuata a livello di ambiente o all’interno di un programma Python con la funzione sys.activate_stack_trampoline.

Altre funzionalità notevoli

  • Sono stati introdotti gli oggetti immortali – il loro conteggio dei riferimenti non cambierà.
  • Dimensioni degli oggetti ridotte – la dimensione dell’oggetto è diminuita a 96 byte.
  • Costanti del calendario per giorni e mesi.
  • Alcune deprecazioni e rimozioni della libreria standard come la rimozione di distutils nella versione recente.
  • Un gran numero di miglioramenti alle funzioni asincrone nella versione recente.

Allego il documento di rilascio, che viene utilizzato come riferimento — https://www.python.org/downloads/release/python-3120/

Quindi vale la pena aggiornare alla versione 3.12?

Buono studio…