Python 3.8 - Le Novità Più Importanti

Pubblicato da Michele Saba

Ciao a tutti bella gente e benvenuti a questo nuovo tutorial!

Oggi vediamo assieme alcune delle novità più importanti rilasciate qualche settimana fa con la nuova versione di Python, la 3.8.

Vi invito a leggere questo articolo con attenzione perché in quanto developers è nostro compito tenerci sempre aggiornati per comportarci al meglio in ogni contesto di sviluppo, e per essere in grado di interpretare il codice scritto da altri sviluppatori con facilità.



Assignment Expressions - (Walrus Operator) 

Iniziamo con una delle features più discusse in tutta la storia stessa di Python, il nuovo operatore di assegnazione conosciuto come Walrus Operator.

Il nome Walrus (che significa tricheco) è stato dato dalla community per via della sua sintassi, che ricorda gli occhi e le zanne di un tricheco, essendo scritto in questo modo := (due punti e un simbolo dell'uguale).

L'operatore Walrus ci consente di assegnare dei valori alle nostre variabili come parte di espressioni più complesse, risparmiando qualche riga di codice.

Facciamo subito un esempio pratico, tratto dall'articolo di presentazione nella documentazione ufficiale.

Supponiamo di avere una lista di numeri fib, e di voler verificare che nella lista siano presenti massimo 10 elementi, mandando in print un messaggio di errore qualora la condizione sia falsa.

Tradizionalmente, prima di Python 3.8, avevamo bisogno di definire una variabile assegnando a questa la lunghezza della nostra lista di numeri:

fib = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

n = len(fib)

if n > 10:
    print(f"La lista contiene troppi elementi ({n} elementi. Aggiungine non più di 10!)")

Ora utilizzando l'Operatore Walrus, possiamo definire e assegnare un valore ad una variabile come parte dell'espressione di controllo stessa, semplificando quindi il codice.

fib = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

if (n := len(fib)) > 10:
    print(f"La lista contiene troppi elementi ({n} elementi. Aggiungine non più di 10!)")

Come già accennato questa nuova caratteristica del linguaggio è una delle più discusse e criticate di sempre.

Ma ricordiamo il fatto che seppur questa nuova feature sia stata introdotta nel linguaggio, non significa necessariamente che debba essere utilizzata da tutti!

A seconda del caso d'uso questo operatore può dimostrarsi molto utile, quindi se non vi piace, semplicemente ricordatevi che esiste e continuate a programmare come meglio ritenete opportuno.



F-Strings Update

In Python 3.8 abbiamo un potenziamento delle f-strings (Formatted String Literals), che diventano ancora più utili ora in contesti di debugging del nostro codice. Supponiamo di voler verificare il valore associato a delle variabili, mandandole in output con print:

username = "pymike00"
location = "Italia"
print(f"username: { username }, location: { location }")

# output: 
username: pymike00, location: Italia

Grazie a questo nuovo aggiornamento delle f-strings, possiamo uniformare questo genere di operazioni e risparmiare qualche carattere, in questo modo: 

username = "pymike00"
location = "Italia"
print(f"{ username= }, { location= }")

# output:
username='pymike00', location='Italia'



Positional-Only Parameters

Questa terza caratteristica è un pò più avanzata, e riguarda la possibilità di definire dei parametri per le nostre funzioni che possono ora essere solamente posizionali.

Facciamo un pò di chiarezza.

def f(x, y, z):
    print(f"{ x } | { y } | { z }")

Tipicamente, i parametri passati alle nostre funzioni possono essere accompagnati o meno dal proprio nome.

Possiamo quindi fare:

>>> f(2, 3, 4)
2 | 3 | 4

oppure anche:

>>> f(y=2, z=3, x=4)
4 | 2 | 3

Nella seconda chiamata alla nostra funzione, avendo passato gli argomenti dei parametri tramite keyword, otteniamo in output i valori in ordine diverso rispetto a come sono stati passati originariamente.

Questo genere di comportamenti potrebbe portare a confusione e volendo, possiamo quindi ora specificare come vogliamo che i parametri siano passati.

Volendo utilizzare solo parametri posizionali, possiamo aggiungere uno / alla fine:

def f(x, y, z, /):
    print(f"{ x } | { y } | { z }") 

f(x=2, y=3, z=4) # codice non consentito
f(y=2, z=3, x=4) # codice non consentito
f(2, 3, 4) # unica variante consentita

Volendo invece solo parametri accompagnati dal nome, possiamo invece aggiungere un * prima dei parametri:

def f(*, x, y, z):
    print(f"{ x } | { y } | { z }") 

f(x=2, y=3, z=4) # codice consentito
f(y=2, z=3, x=4) # codice consentito
f(2, 3, 4) # variante non consentita

Spero che questo articolo ti sia stato utilie.

Per scoprire il resto delle novità minori e delle migliorie di questa nuova release, dai uno sguardo alla pagina di presentazione dalla documentazione ufficiale.

Iscriviti alla newsletter per rimanere sempre in aggiornamento e migliorare le tue abilità di developer.

Ci vediamo nel prossimo articolo, e come al solito Buono Studio, Buon Lavoro ed Happy Coding! 


Vuoi imparare Python come un/a professionista? Dai uno sguardo ai nostri