Esta es una de las características que más confunde y gusta a los novatos en Python. Confunde porque es un poco confuso y gusta porque, al hacer el código más escueto y difícil de entender, parece que es más “avanzado”.
En lo primero tienes razón; sin embargo, en lo segundo, nada podría estar más lejos de la verdad, pequeño saltamontes.
El código de calidad es claro y correcto, pero no divaguemos y veamos de qué va eso de truthy y falsy.
True y false
True y false son los únicos valores posibles que puede tener un tipo booleano. Ahora bien, siempre podemos convertir un tipo en otro. Por ejemplo, una cadena en una lista:
list('abcbdbert')
# devolverá ['a', 'b', 'c', 'b', 'd', 'b', 'e', 'r', 't']
Esta conversión es explícita, he tenido yo que hacer algo (llamar a la función list). Hay otras conversiones que son implícitas; las hace el propio Python sin que yo haga nada y, a veces, incluso sin que yo me entere (ahí está el peligro).
Truthy y falsy
Se le llama truthy a todos aquellos valores que se convierten en true de forma implícita, cuando están en un contexto booleano.
Un contexto booleano es todo aquel código donde se espera un valor booleano:
- Un if.
- Un while.
- Una expresión booleana.
- Etc.
Veamos un ejemplo:
“Fistro” and True
En muchos lenguajes, una expresión como esa daría un error. En Python, la cadena se convierte de forma implícita en un booleano y se evalúa la expresión.
Truthy
Son truthy los siguientes valores:
- Cualquier cadena, lista, set, diccionario, tupla o rango que no esté vacío.
- Cualquier número distinto de cero.
Falsy
Son falsy los siguientes valores:
- Cualquier cadena, lista, set, diccionario, tupla o rango que esté vacío.
- El cero.
- None.
Por lo tanto, el resultado de la expresión anterior será true, ya que “Fistro” se convierte, de forma implícita, en true.
¿Para qué se usan los valores Truthy y Falsy en Python?
Se utiliza a embudo para escribir código más escueto. Personalmente no soy un gran fan de ello, al hacer el código más difícil de entender para ahorrarte un par de líneas no me salen las cuentas.
Sin embargo, hay que saber entenderlo, porque lo vas a ver «en la calle».
La clave está en entender que cuando se produce un valor truthy o falsy no obtienes el booleano resultante, sino el valor original.
Esto permite crear una función como la siguiente, que recibe dos parámetros y los devuelve en una tupla. A no ser que el segundo sea none; en ese caso, devuelve una tupla con el primer valor y el segundo será la cadena ‘default’:
def f(x, s=None):
s = s or 'default' # nil coalescing
return (x, s)
f(10, '42') # devuelve (10, '42')
f(42) # devuelve (10, ‘default’)
Mi recomendación es que no abuses de esto.