Une utilisation étonnante du mot-clé « or » en python
Aujourd’hui, on écrit du code compact. Savez-vous qu’il est possible d’utiliser le mot clé python or pour une affectation de valeur conditionnelle simple et élégante?
Lorsque l’on souhaite affecter conditionnellement des valeurs, on aura tendance à utiliser des structures if. Ici on va s’intéresser au cas où la valeur reçue est None, qu’on souhaite dans ce cas remplacer par une valeur par défaut autre.
val = get_some_value() if val is None: val = 'default' some_function(val)
Mais cela pourrait s’écrire bien plus simplement de la façon suivante:
val = get_some_value() some_function(val or 'default')
Par quel miracle? Simplement, lorsqu’on utilise l’opération booléene or, python évalue la fonction __nonzero__ (ou bien __bool__ en Python 3) de l’object « de gauche ». Si cette évaluation retourne False, l’objet de « droite » est choisi.
Il se trouve que None, "", 0, [] ou encore {} par exemple sont tous évalués à False.
Pour complément, lorsque qu’un objet est précédé de if, son évaluation booléenne est aussi exécutée.
Cela permet entre autres d’écrire:
my_list = get_list()
if my_list:
# ... do things
au lieu de:
my_list = get_list()
if my_list is not None and len(my_list) > 0:
# ...
Élégant, non? Il m’arrive souvent d’implémenter cette fonction __nonzero__ dans mes classes, lorsque ça a du sens. Par exemple, une classe représentant un fichier pourrait être équivalent à True si le fichier existe.