L'operatore walrus (:=), o operatore di assegnazione dell'espressione, è apparso in Python a partire dalla versione 3.8. È stato introdotto per consentire di assegnare un valore a una variabile direttamente nelle espressioni (ad esempio, nelle condizioni dei cicli o degli if), ovvero per ottenere e utilizzare immediatamente il risultato di una funzione o di un calcolo, senza dover ripetere la chiamata due volte.
Il problema risolto dal walrus è la necessità di duplicare i calcoli o di scrivere righe di codice superflue solo per l'assegnazione: prima della sua introduzione si doveva fare una chiamata separata e poi utilizzare il risultato.
La soluzione: ora l'espressione può essere assegnata immediatamente a una variabile all'interno della condizione, rendendo il codice più conciso e, a volte, più leggibile. È importante tenere a mente che l'applicazione eccessiva del walrus può rendere il codice difficile da comprendere, specialmente per colleghi meno esperti.
Esempio di codice:
while (line := input('Inserisci una stringa: ')) != 'exit': print(f'Hai inserito: {line}')
Caratteristiche chiave:
È possibile utilizzare l'operatore walrus per assegnare un valore a una variabile globale?
Sì, è possibile, tuttavia il walrus funziona nell'ambito di visibilità in cui è stato applicato. È necessario tenere presente la regola LEGB e utilizzare le variabili al di fuori delle funzioni con cautela.
Qual è la differenza tra x = expr e (x := expr)?
x = expr è un'istruzione di assegnazione autonoma, mentre (x := expr) è un'espressione che restituisce il risultato di expr e lo assegna a x all'interno di un'altra espressione. In molti casi, la seconda può essere utilizzata nelle condizioni if, nel ciclo while o nelle espressioni di lista.
Può essere utilizzato il walrus all'interno delle espressioni di lista e dei generatori?
Sì, il walrus è comunemente utilizzato nelle comprensioni, il che è particolarmente utile per evitare calcoli ripetuti.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Qui n memorizza il risultato di int(s), risparmiando calcoli
Un sviluppatore scrive un lungo e complicato if con diversi walrus annidati:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Vantaggi:
Svantaggi:
Utilizzo consapevole per risparmiare calcoli e migliorare la leggibilità:
while (line := sys.stdin.readline()) != '': process(line)
Vantaggi:
Svantaggi: