Vai al contenuto
Logo di Python 3.15

Logo: Python

Python 3.15 è stato rilasciato il 9 ottobre 2026. Secondo la documentazione ufficiale del progetto, la versione mescola modifiche al linguaggio, all’implementazione e alla libreria standard. Le novità principali sono gli import espliciti in modalità lazy, i nuovi tipi predefiniti frozendict e sentinel, UTF-8 come codifica predefinita, l’unpacking nelle comprehension e una ABI stabile per le build free-threaded. Il compilatore JIT sperimentale riceve un aggiornamento importante.

Python 3.15 è uscito: Import lazy, frozendict e il profiler Tachyon
Grafica: opengeek

Lazy import: caricare i moduli solo quando servono

Tra le novità dell’interprete c’è la PEP 810. Con la nuova parola chiave lazy un import viene rimandato fino al primo uso del nome: Python crea un oggetto proxy leggero e carica il modulo solo a quel punto. L’obiettivo dichiarato è ridurre i tempi di avvio delle applicazioni con molte dipendenze, senza spostare gli import dentro le funzioni.

  • La sintassi vale per import e from ... import, ad esempio lazy import json.
  • Se il modulo non esiste, l’errore compare al primo utilizzo; il traceback indica sia il punto di accesso sia l’import originale.
  • Si può attivare in blocco con l’opzione -X lazy_imports o con la variabile PYTHON_LAZY_IMPORTS, che accettano i valori all e normal (predefinito).
  • Le funzioni sys.set_lazy_imports(), sys.get_lazy_imports() e sys.set_lazy_imports_filter() permettono di cambiare e interrogare la modalità a runtime, o di rendere lazy solo certi moduli.
  • Gli import lazy sono ammessi solo a livello di modulo: dentro funzioni, classi o blocchi try generano un SyntaxError, come gli star import e i future import.
  • Per il codice che deve restare compatibile con versioni precedenti, un modulo può definire __lazy_modules__, un elenco di nomi trattati come lazy.

Nuovi tipi e sintassi: frozendict, sentinel, unpacking

Il builtin frozendict (PEP 814) è un dizionario immutabile. Non è una sottoclasse di dict ma eredita direttamente da object; è hashable se lo sono chiavi e valori, conserva l’ordine di inserimento ma il confronto lo ignora. Moduli come copy, decimal, json, pickle e pprint lo accettano. Chi controlla il tipo con isinstance(arg, dict) può passare a isinstance(arg, (dict, frozendict)) oppure a collections.abc.Mapping.

Il nuovo builtin sentinel (PEP 661) serve a creare valori sentinella unici con una rappresentazione concisa. Mantiene l’identità quando viene copiato, si usa nelle espressioni di tipo con l’operatore | e si può serializzare con pickle se importabile per modulo e nome.

Con la PEP 798, list, set e dict comprehension e le generator expression accettano * e **. Per esempio [*L for L in lists] appiattisce una lista di liste, ed equivale a una comprehension annidata o a itertools.chain.from_iterable(). Vale anche per le generator expression asincrone.

Tachyon, il nuovo profiler a campionamento

Il nuovo pacchetto profiling (PEP 799) riunisce gli strumenti di profilazione: profiling.tracing accoglie il tracciamento deterministico spostato da cProfile, mentre profiling.sampling ospita Tachyon. cProfile resta come alias per compatibilità, mentre il modulo profile è deprecato e sarà rimosso in Python 3.17.

Tachyon campiona periodicamente gli stack dei processi in esecuzione senza modificare il codice né riavviare l’applicazione. Per collegarsi tramite PID occorrono i permessi di lettura della memoria del processo, la stessa versione minor di Python e build compatibili rispetto al free-threading; per le prerelease è richiesta la stessa versione esatta. La documentazione parla di frequenze fino a 1.000.000 Hz e lo definisce il profiler a campionamento più veloce disponibile per Python al momento del contributo. Funziona in quattro modalità di misura.

Opzione Cosa misura
--mode wall (predefinita) Tempo reale trascorso, comprese attese di I/O e rete
--mode cpu Solo il tempo di esecuzione attiva sulla CPU
--mode gil Tempo in cui un thread detiene il GIL
--mode exception Campioni dai soli thread con un’eccezione attiva

I formati di output sono --pstats, --collapsed per i flame graph esterni, --flamegraph in HTML, --gecko per Firefox Profiler e --heatmap a livello di riga. Ci sono poi una modalità interattiva --live, il supporto ad async/await con --async-aware, l’analisi per opcode con --opcodes e il comando dump per ottenere un’istantanea dei thread di un processo bloccato.

JIT, ABI free-threaded e binari ufficiali

Secondo la documentazione, il compilatore JIT sperimentale è stato aggiornato in modo significativo ed è tra i principali miglioramenti dell’interprete.

  • PEP 803: le estensioni C che usano la Stable ABI possono essere compilate per la nuova ABI stabile per le build free-threaded (abi3t), cosa che richiede in genere modifiche non banali al codice.
  • PEP 831: CPython è compilato di default con i frame pointer, per rendere più rapido e affidabile lo stack unwinding di profiler, debugger ed eBPF. I sistemi di build di terze parti dovrebbero mantenere gli stessi flag.
  • I binari ufficiali per Windows a 64 bit usano ora l’interprete tail-calling.
  • I binari ufficiali per macOS installano di default il supporto al free-threading.

Altre modifiche e come aggiornarsi

La PEP 829 introduce i file .start, con voci nel formato pkg.mod:callable, per rendere verificabile il codice eseguito all’avvio. Le righe import nei file .pth sono deprecate in modo silenzioso e vengono ignorate se esiste un .start corrispondente. Tra le novità di tipizzazione figurano TypedDict con extra item tipizzati (PEP 728), TypeForm (PEP 747) e le disjoint base (PEP 800); la PEP 782 aggiunge l’API C PyBytesWriter. La versione porta anche più colore nell’output da riga di comando e messaggi di errore migliorati.

Per chi migra da versioni precedenti, la documentazione rimanda alla guida «Porting to Python 3.15» e al changelog completo.

Leggi anche