Dopo un anno di sviluppo, è stata pubblicata una versione significativa del linguaggio di programmazione Python 3.12. Questa nuova versione sarà supportata per un anno e mezzo, dopodiché verranno forniti aggiornamenti per la correzione delle vulnerabilità per altri tre anni e mezzo.
È iniziata contemporaneamente la fase di alpha testing della versione Python 3.13, che introduce una modalità di compilazione di CPython senza il Global Interpreter Lock (GIL). La versione Python 3.13 rimarrà in fase di alpha per sette mesi, durante i quali saranno aggiunte nuove funzionalità e corretti i bug (secondo il nuovo programma di sviluppo, il lavoro sulla nuova versione inizia cinque mesi prima del rilascio della versione precedente, arrivando alla fase di alpha testing al momento del rilascio successivo). Dopo di che, per tre mesi si svolgerà il testing delle versioni beta, durante il quale non sarà consentito aggiungere nuove funzionalità e l'attenzione si concentrerà sulla correzione dei bug. Gli ultimi due mesi prima del rilascio vedranno la versione passare alla fase di candidato per il rilascio, dove verrà effettuata la stabilizzazione finale.
Tra le novità introdotte in Python 3.12:
- Aumentata la flessibilità nella gestione delle f-string (literal formattati con prefisso ‘f’), che ha permesso di eliminare molte limitazioni. Ad esempio, all'interno delle f-string ora è possibile indicare qualsiasi espressione valida per Python, comprese le espressioni multi-riga, i commenti, i backslash e le sequenze di escape per Unicode. Inoltre, all'interno della stringa ora è consentito riutilizzare gli stessi caratteri di apice utilizzati per delimitare la f-string (ovvero, all'interno è possibile riutilizzare le virgolette doppie senza dover passare a quelle singole). È stata aumentata l'informatività dei messaggi di errore nelle f-string, che ora indicano il punto esatto nella stringa che ha causato l'errore.
Ad esempio, in Python 3.12 sono consentite le seguenti costruzioni: print(f"This is the playlist: {"\n".join(songs)}") print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") print(f"This is the playlist: {", ".join([ … ‘Take me back to Eden’, # Oh, quegli occhi come fuoco … ‘Alkaline’, # Né acido né alcalino … ‘Ascensionism’ # Porta finalmente ai cieli infranti … ])}")
- Per migliorare l'efficienza nell'utilizzo delle risorse dei sistemi multi-core, è stata implementata la supporto per interpreti isolati e blocchi globali separati (GIL, Global Interpreter Lock) per diversi interpreti all'interno del processo (CPython consente di eseguire più interpreti nella stessa istanza). Attualmente, questa funzionalità è accessibile solo tramite C-API (il supporto nell'API Python arriverà nella prossima versione significativa).
- Nel codice Python è stata aggiunta la possibilità di utilizzare il protocollo buffer. Le classi che forniscono il metodo «__buffer__()» possono ora essere utilizzate come tipi che operano direttamente con dati binari in memoria.
- È stato proposto il modulo sys.monitoring per il debugging e il profiling, che consente di monitorare eventi in CPython come chiamate, ritorni dalle funzioni, esecuzione di righe di codice arbitrarie, eccezioni e transizioni con il minimo di overhead.
- Nell'interprete è stata implementata la supporto per il sottosistema perf del kernel Linux, che consente di determinare i nomi delle funzioni Python durante il profiling utilizzando l'utility perf (in precedenza, solo i nomi delle funzioni C erano definiti nei tracciamenti).
- Aumentata l'informatività dei messaggi di errore e ampliata la gamma di eccezioni che offrono raccomandazioni per la correzione degli errori di battitura. Ad esempio, ora vengono visualizzate raccomandazioni per l'importazione di moduli dimenticati dalla libreria standard, vengono fornite indicazioni per aggiungere il prefisso «self.» nei metodi, viene identificata la scrittura «import x from y» invece di «from y import x» e così via. sys.version_info NomeErrato: nome 'sys' non è definito. Hai dimenticato di importare 'sys'? somethin = blech NomeErrato: nome 'blech' non è definito. Volevi dire: 'self.blech'? import a.y.z from b.y.z SintassiErrore: Volevi usare 'from ... import ...' invece? from collections import chainmap ImportErrore: impossibile importare il nome 'chainmap' da 'collections'. Volevi dire: 'ChainMap'?
- Continuato il lavoro sull'ottimizzazione delle prestazioni. L'aumento totale delle prestazioni derivante dalle ottimizzazioni aggiunte è stimato al 5%.
- Nel processo di build è stata aggiunta la supporto sperimentale per l'ottimizzatore binario BOLT, che aumenta le prestazioni dal 1% al 5%.
- Implementata l'esecuzione in linea delle comprensioni, che accelera fino a due volte l'operatività con le comprensioni (per il codice che utilizza intensamente le comprensioni, i test hanno mostrato un incremento delle prestazioni complessive dell'11%).
- Ridotto di 8-16 byte il dimensionamento degli oggetti Unicode.
- Accelerate le operazioni con espressioni regolari re.sub(), re.subn() e re.Pattern.
- Eseguiti i controlli isinstance() da 2 a 20 volte più velocemente per alcuni protocolli.
- Notevolmente migliorate le prestazioni del pacchetto asyncio (in alcuni test si osserva un'accelerazione del 75%).
- Accelerata la creazione della classe asyncio.Task.
- Accelerate significativamente (in alcuni test fino al 64%) le funzioni tokenize.tokenize() e tokenize.generate_tokens().
- Accelerata la caricamento degli attributi e la chiamata al metodo super().
- Proposto un nuovo e più compatto modo di scrivere le annotazioni di tipo per classi e funzioni generiche. def max[T](args: Iterable[T]) -> T: … class list[T]: def __getitem__(self, index: int, /) -> T: … def append(self, element: T) -> None: …
- Fornito un nuovo modo per definire alias di tipo usando l'espressione «type» type Point = tuple[float, float] type Point[T] = tuple[T, T]
- Nel modulo typing è stato aggiunto un nuovo decoratore @override, che informa i sistemi di controllo dei tipi che il metodo nella sottoclasse è destinato a sovrascrivere il metodo o l'attributo nella superclasse. Il decoratore può essere utilizzato per rilevare errori legati al fatto che il metodo destinato a essere sovrascritto non esegue tale azione. class Base: def log_status(self) -> None: … class Sub(Base): @override def log_status(self) -> None: # Ok, sovrascrive Base.log_status … @override def done(self) -> None: # Il sistema di controllo dei tipi rileverà un errore …
- Per migliorare la sicurezza, le implementazioni integrate degli algoritmi SHA1, SHA3, SHA2-384, SHA2-512 e MD5 in hashlib sono state sostituite da varianti formalmente verificate del progetto HACL* (le implementazioni integrate vengono utilizzate solo se OpenSSL non è presente).
- In CPython è stata implementata la protezione contro il overflow dello stack.
- Nella classe pathlib.Path è stato realizzato il supporto per le sottoclassi.
- Nel modulo os è stato ampliato il supporto per la piattaforma Windows. Ad esempio, durante l'uso in Windows è stato aggiunto il supporto per i metodi os.listdrives(), os.listvolumes() e os.listmounts(), e aumentata la precisione di os.stat() e os.lstat().
- Nei moduli sqlite3 e uuid sono stati aggiunti interfacce da riga di comando ("python -m sqlite3" e "python -m uuid").
- Nell'API C è stato aggiunto il supporto per oggetti "immortali", per i quali non viene applicato il conteggio dei riferimenti.
- È stato implementato un concetto di livello C API instabile, progettato per essere utilizzato in debugger, compilatori JIT e altri strumenti a basso livello.
- È stata effettuata una ripulitura delle funzionalità obsolete.
- Sono stati rimossi i moduli asynchat, asyncore, smtpd, imp e distutils (il modulo distutils può essere utilizzato dal pacchetto setuptools).
- Dalla realizzazione C degli oggetti unicode sono state rimosse le proprietà wstr e wstr_length.
- Sono stati rimossi i metodi obsoleti dal modulo unittest.
- Sono state rimosse funzioni, classi e metodi obsoleti o non funzionanti normalmente, inclusi locale.format(), io.OpenWrapper, ssl.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile, ecc.
- Nel modulo webbrowser è stata interrotta la supporto per i browser obsoleti, tra cui Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird e Firefox fino alla versione 36.
- Nel contesto della preparazione per future ottimizzazioni è stata modificata la rappresentazione interna degli interi.
Fonte: opennet.ru
