El operador walrus (:=), o operador de asignación de expresiones, apareció en Python a partir de la versión 3.8. Se introdujo para permitir la asignación de valores a variables directamente dentro de expresiones (por ejemplo, en condiciones de bucles o if), es decir, obtener y utilizar el resultado de una función o cálculo de inmediato, sin necesidad de repetir la llamada dos veces.
El problema que resuelve el walrus es la necesidad de duplicar cálculos o escribir líneas de código innecesarias solo para la asignación: antes de su aparición, era necesario hacer una llamada separada y luego usar el resultado.
Solución: ahora se puede asignar inmediatamente una expresión a una variable dentro de una condición, lo que hace que el código sea más conciso y, a veces, más legible. Es importante recordar que el uso excesivo del walrus puede dificultar la comprensión del código, especialmente para colegas menos experimentados.
Ejemplo de código:
while (line := input('Introduce una cadena: ')) != 'exit': print(f'Has introducido: {line}')
Características clave:
¿Se puede utilizar el operador walrus para asignar un valor a una variable global?
Sí, se puede, sin embargo, el walrus trabaja dentro del ámbito donde se aplicó. Se debe tener en cuenta la regla LEGB y usar con cuidado las variables fuera de funciones.
¿Cuál es la diferencia entre x = expr y (x := expr)?
x = expr es una instrucción de asignación independiente, mientras que (x := expr) es una expresión que devuelve el resultado de expr y lo asigna a x dentro de otra expresión. En muchos casos, el segundo se puede usar en condiciones if, en el bucle while o en expresiones de lista.
¿Puede el walrus ser utilizado dentro de expresiones de lista y generadores?
Sí, el walrus se utiliza frecuentemente en comprehensions, lo que es especialmente útil para evitar cálculos repetidos.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Aquí n guarda el resultado de int(s), ahorrando cálculos
Un desarrollador escribe un if largo y confuso con varios walrus anidados:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Ventajas:
Desventajas:
Uso consciente para ahorrar cálculos y mantener la legibilidad:
while (line := sys.stdin.readline()) != '': process(line)
Ventajas:
Desventajas: