Contenido

Python: Asignaciones con valores por defecto.

Contenido

Hace algún tiempo que Manolowar me presentó al operador Elvis de Groovy.

Python

Este operador, con la forma: ?: debe su nombre a que parece un emoticono con tupé, similar a Elvis Presley. Puede utilizarse como en C o Java (por separado) o todo junto. Cuando está todo junto quiere decir algo así como: “Si el valor no es falso, me lo asignas, y si no, me asignas esto otro”. Veamos un ejemplo:

1
2
Integer i = null;
int a = i ?: 0;

En este caso queremos asignar a A el valor de I. Esto es un problema, ya que I admite nulos pero A no. De esta manera tan sencilla se ha solucionado el problema.

Pero… ¿este artículo no va de Python?

Pues sí, justamente. Ayer David me contó la manera de hacer esto mismo en Python y, a mi entender, es muchísimo más elegante. Basta con usar el operador “OR”.

Contrariamente a lo que siempre había pensado, en Python “OR” no devuelve un booleano, sino que evalúa la expresión y devuelve el primer resultado no falso. De esta manera, podríamos tener:

1
2
i = None
a = i or 7

Con lo que A valdrá 7, ya que la I es falsa y el último valor evaluado que no es falso es 7.

La gran ventaja de esto es que se puede concatenar. Ejemplo (no hacer en casa):

1
a = 0 or '' or [] or {} or False or "Todas las anteriores son falsas"

¿Cuál sería el resultado en este caso?

Como podréis observar, todas las condiciones son falsas salvo la última, por lo que el valor de A será “Todas las anteriores son falsas”.

Usadlo con cuidado!!!

Notas

He tratado de tener cuidado de indicar siempre que se busca el primero no falso". Esto no significa “el primero verdadero”, ya que “verdadero” es True. Es el primero que no cumpla “una condición falsa .