Toutes mes excuses si cela a déjà été demandé, mais j’ai cherché en vain une réponse à ma question exact. Fondamentalement, avec Python 2.7, j'ai un programme exécutant une série d'outils de géotraitement, qui dépend de ce qui est demandé via une série de variables True/False que l'utilisateur ajuste dans le script, par exemple.
x = True
if x:
run function
Cependant, j'ai maintenant découvert que x n'a pas besoin d'être littéralement "True" pour que la fonction s'exécute. Par exemple:
In: x = True
if x:
print True
Out: True
In: x = 123
if x:
print True
Out: True
In: x = 'False'
if x:
print True
Out: True
In: x = False
if x:
print True
Out:
Donc, toute valeur autre que False semble être évaluée à True, ce qui ne serait pas le cas si x == True ou si x est True . Vu que PEP 8 recommande fortement d’utiliser uniquement le si x: variante, quelqu'un peut-il expliquer pourquoi ce problème se produit? Il semble que si x: est plus un test pour "si x n'est pas faux" ou "si x existe". Dans cet esprit, je pense que je devrais utiliser si x est True: dans ce cas, malgré ce que PEP 8 a à dire.
Sincères amitiés
Les valeurs suivantes dans Python sont false dans le contexte de if
et d'autres contextes logiques:
False
None
0
, 0.0
, -0.0
''
et u''
__bool__
(en Python3) pour renvoyer False
ou __nonzero__
(en Python2) pour renvoyer False
ou 0
.__bool__
(en Python3) ou __nonzero__
(en Python2), mais implémente __len__
pour renvoyer une valeur égale à 0Un objet est considéré comme "faux" si l'un de ces cas s'applique, et "vrai" sinon, qu'il soit réellement égal ou identique à False
ou True
Maintenant, si vous avez arrangé que x
est nécessairement l'un des objets True
ou False
, vous pouvez alors écrire en toute sécurité if x
. Si vous avez prévu que "la justesse" de x
indique si l'opération doit être effectuée ou non, quel que soit son type, vous pouvez écrire en toute sécurité if x
. Où vous pouvez écrire que vous devriez préférer le faire, car c'est plus propre à lire.
Normalement, s'il est permis à x
de prendre la valeur True
, alors vous êtes dans l'un de ces deux cas et vous n'écririez donc pas if x is True
. L'important est de documenter correctement la signification de x
, afin qu'elle reflète le test utilisé dans le code.
Les programmeurs Python sont censés savoir ce qui est considéré comme vrai. Par conséquent, si vous documentez simplement, "exécute la fonction si x
est true", cela indique ce que fait votre code original. En le documentant, "exécute la fonction si x is True
" aurait une signification différente et est moins couramment utilisé précisément en raison de la règle de style de PEP8 qui dit de tester la véracité plutôt que la valeur spécifique True
.
Cependant, si vous vouliez que le code se comporte différemment dans le cas où x
est un conteneur vide du cas où il est None
, alors vous écririez quelque chose comme if x is not None
.
x = 'False'
x = 123
Sont tous les deux True
Le document explique d'autres valeurs.
En ce qui concerne la raison PEP8, son beaucoup plus sémantique à lire if this_file_is_green
Les autres valeurs de Falsey incluent 0
, ''
, []
. Vous devriez simplement utiliser la version if x:
.
Il va sans dire que vous devriez écrire un code qui fait ce dont vous avez besoin. Mais dans la plupart des cas, vous n'avez simplement pas besoin de dire == True
ou is True
, car vous n'avez pas besoin de distinguer True
des autres valeurs "vérité". Il est donc recommandé de laisser cela de côté pour des raisons de simplicité.
Le cas où vous devriez absolument utiliser == True
ou is True
est celui où vous do devez distinguer True
d'autres valeurs de vérité.
Dans votre exemple, vous souciez-vous de la différence entre True
et 123
? Cela vous indiquerait le moyen de le coder.
Une chose à propos du codage == True
ou is True
: cela déclenchera un drapeau rouge mineur lorsque les autres développeurs liront votre code. Ils ne penseront pas que c'est faux, ils se demanderont simplement pourquoi il existe et voudront savoir pourquoi il est important de traiter True
différemment des autres valeurs de vérité dans ce cas particulier.
En d'autres termes, si vous n'en avez pas besoin, mieux vaut ne pas l'utiliser.
La capacité de dire
if x:
...
est considéré comme une fonctionnalité. Vous pouvez également spécifier quand le test doit être considéré comme satisfaisant ou non pour les classes définies par l'utilisateur (définissez simplement la méthode __nonzero__
en Python 2.x ou __bool__
en Python 3).
Par exemple, pour les chaînes et les conteneurs tels que des listes, des dictionnaires ou définit le test if x ...
signifie "si x n'est pas vide".
Notez que la raison n'est pas que cela permet moins de code à écrire, mais que le code résultant est plus facile à lire et à comprendre.
Si vous préférez écrire if x is True ...
, avez-vous envisagé d'aller plus loin dans cette voie vers if (x is True) is True ...
ou if ((x is True) is True) is True ...
? :-)