Python 3.9: cosa c'è di nuovo e migliore

Python 3.9, rilasciato oggi, apporta modifiche significative sia alle caratteristiche del linguaggio che al modo in cui il linguaggio viene sviluppato. Python si è moltiplicato in popolarità negli ultimi anni e il suo utilizzo è esploso in aree in rapida evoluzione come la scienza dei dati e l'apprendimento automatico. Il progetto sta lavorando duramente per tenere il passo con tutte le nuove richieste. 

Ecco un riepilogo di tutte le nuove grandi funzionalità di Python 3.9.

Python passa a un ciclo di rilascio annuale

Fino a questo punto, Python è stato sviluppato e rilasciato con una cadenza di diciotto mesi. PEP 602 ha proposto che il team di sviluppo di Python adotti un ciclo di rilascio annuale e tale proposta è stata accettata. 

Un ciclo di rilascio annuale significa meno funzionalità per rilascio, ma significa anche un feedback più rapido sul test delle funzionalità, meno modifiche potenzialmente dannose per ogni versione e quindi più incentivi per gli utenti e i gestori della distribuzione Linux ad aggiornare Python più spesso. Significa anche che le nuove funzionalità proposte alla fine del ciclo di sviluppo non impiegheranno molto tempo per essere introdotte in una nuova versione.

La nuova sequenza temporale significa che Python 3.9 sarà disponibile nell'ottobre 2020. Python 3.10 ha ufficialmente iniziato lo sviluppo pre-alpha il 19 maggio 2020, entrerà nella fase di sviluppo alpha quando Python 3.9 sarà disponibile e sarà disponibile nell'ottobre 2021. Le future versioni di Python seguiranno il stesso modello.

Python diventa più veloce per impostazione predefinita

Ogni revisione di Python gode di miglioramenti delle prestazioni rispetto alla versione precedente. Python 3.9 introduce due grandi miglioramenti che aumentano le prestazioni senza richiedere alcuna modifica al codice esistente.

Il primo miglioramento prevede un maggiore utilizzo del vectorcallprotocollo introdotto in Python 3.8. vectorcallrende più veloci molte chiamate di funzioni comuni riducendo al minimo o eliminando gli oggetti temporanei creati per la chiamata. In Python 3.9, diversi built-in Python - range, tuple, set, frozenset, list, dict- vengono utilizzati vectorcallinternamente per velocizzare l'esecuzione.

Il secondo grande potenziatore di prestazioni è un'analisi più efficiente del codice sorgente Python. Il nuovo parser per il runtime CPython non è stato progettato per risolvere i problemi di prestazioni, ma piuttosto per gestire le incongruenze interne nel parser originale. Tuttavia, un importante vantaggio secondario è l'analisi più rapida, soprattutto per grandi volumi di codice.

Più stringhe Python e funzioni di dizionario

Python semplifica la manipolazione dei tipi di dati comuni e Python 3.9 estende questa facilità con nuove funzionalità per stringhe e dizionari. Per le stringhe, ci sono nuovi metodi per rimuovere prefissi e suffissi, operazioni che hanno richiesto a lungo molto lavoro manuale per essere eseguite. Per i dizionari, ora ci sono operatori di unione, uno per unire due dizionari in un nuovo dizionario e uno per aggiornare il contenuto di un dizionario con un altro dizionario.

I decoratori perdono alcune restrizioni

I decoratori ti consentono di eseguire il wrapping delle funzioni Python per modificare i loro comportamenti a livello di codice. In precedenza, i decoratori potevano essere costituiti solo dal simbolo @, da un nome (ad esempio func) o da un nome puntato ( func.method) e facoltativamente da una singola chiamata ( func.method(arg1, arg2)). Con Python 3.9, i decoratori possono ora essere costituiti da qualsiasi espressione valida.

Un modo di vecchia data per aggirare questa restrizione era creare una funzione o un'espressione lambda che sostituisse un'espressione più complessa se usata come decoratore. Ora qualsiasi espressione va bene, a condizione che produca qualcosa che possa funzionare come decoratore.

Nuove operazioni di tipo Python

Nelle ultime versioni, Python ha ampliato il supporto per i suggerimenti sul tipo. Questo è principalmente per il bene di linters e code checker; i tipi non vengono applicati in fase di esecuzione in CPython e non ci sono piani per rendere Python un linguaggio tipizzato staticamente. Ma il suggerimento sul tipo è uno strumento potente per garantire la coerenza in basi di codice di grandi dimensioni, quindi il codice Python può ancora trarre vantaggio dall'avere suggerimenti sul tipo. 

Due nuove funzionalità per i suggerimenti sul tipo e le annotazioni di tipo sono state introdotte in Python 3.9. In uno, i suggerimenti sul tipo per i contenuti delle raccolte, ad esempio elenchi e dizionari, sono ora disponibili in Python in modo nativo. Ciò significa che puoi ad esempio descrivere un elenco come list[int] - un elenco di numeri interi - senza bisogno della typinglibreria per farlo.

La seconda aggiunta ai meccanismi di digitazione di Python è la funzione flessibile e le annotazioni delle variabili. Ciò consente l'uso del Annotatedtipo per descrivere un tipo utilizzando metadati che possono essere esaminati in anticipo (con strumenti di linting) o in fase di esecuzione. Ad esempio, Annotated[int, ctype("char")]potrebbe essere usato per descrivere un intero che dovrebbe essere considerato come un chartipo in C. Per impostazione predefinita, Python non farebbe nulla con una tale annotazione, ma potrebbe essere usato dai linter di codice. 

Miglioramenti agli interni di Python

La pulizia, il perfezionamento e la modernizzazione degli interni di Python è un'iniziativa in corso per gli sviluppatori di Python e Python 3.9 ha un paio di modifiche in questo senso.

Il primo è una riprogettazione del modo in cui i moduli interagiscono con i macchinari di importazione. I moduli di estensione Python, scritti in C, possono ora utilizzare un nuovo meccanismo di caricamento che li fa comportare più come normali moduli Python quando vengono importati. Diversi moduli nella libreria standard di Python nuova supportano questo comportamento: _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref. Il nuovo meccanismo di caricamento non solo consente ai moduli di estensione di essere gestiti in modo più flessibile da Python, ma abilita anche nuove funzionalità come comportamenti di hooking avanzati.

La seconda iniziativa di pulizia è un ABI interno stabile per CPython, garantito per durare per tutta la vita di Python 3. Storicamente, ogni revisione principale di Python è stata ABI incompatibile con le versioni precedenti, richiedendo la ricompilazione dei moduli di estensione per ogni nuova versione. D'ora in poi, tutti i moduli di estensione che utilizzano l'ABI stabile funzioneranno con le versioni di Python. Con Python 3.9, i seguenti moduli della libreria standard usa lo stabile ABI: audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib.

Altre modifiche in Python 3.9

  • La libreria standard di Python ora supporta il database dei fusi orari IANA. Detto database è ben mantenuto e ampiamente utilizzato, e avere un modo diretto per usarlo nella libreria datetime di Python sarà un grande, ehm, risparmio di tempo.
  • I nuovi metodi di stringa consentono una facile rimozione di prefissi e suffissi. Questo è uno di quegli scenari di utilizzo quotidiano comuni che richiedevano un po 'più di quanto sembrava necessario. I metodi new .removeprefix()e .removesuffix()restituiscono una copia modificata di una stringa meno il prefisso o il suffisso in questione, a condizione che esistano nella stringa.

Come fare di più con Python

  • 4 controlli di tipo Python per mantenere pulito il codice
  • Stile Python: 5 strumenti per ripulire il tuo codice Python
  • Come lavorare con il tipo di dati dell'elenco Python
  • Come creare pacchetti di app Python con BeeWare Briefcase
  • Come eseguire Anaconda fianco a fianco con altri Pythons
  • Come usare le dataclass Python
  • Inizia con async in Python
  • Come usare asyncio in Python
  • 3 passaggi per una revisione asincrona di Python
  • Come utilizzare PyInstaller per creare eseguibili Python
  • Tutorial Cython: come velocizzare Python
  • Come installare Python in modo intelligente
  • Come gestire i progetti Python con Poetry
  • Come gestire progetti Python con Pipenv
  • Virtualenv e venv: spiegazione degli ambienti virtuali Python
  • Python virtualenv e venv cosa fare e cosa non fare
  • Spiegazione del threading e dei sottoprocessi di Python
  • Come utilizzare il debugger Python
  • Come usare timeit per profilare il codice Python
  • Come usare cProfile per profilare il codice Python
  • Come convertire Python in JavaScript (e viceversa)