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.