Booléens Python - si x :, vs si x == Vrai, vs si x est Vrai
Excuses si cela a été demandé avant, mais j'ai cherché en vain une réponse à ma exacte question. En fait, avec Python 2.7, j'ai un programme en cours d'exécution d'une série d'outils de géotraitement, dépendait de ce qui est reqested via une série de Vrai/Faux les variables 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 "Vrai" pour la fonction à exécuter. 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:
De sorte que toute valeur autre que la valeur False semble avoir la valeur True, ce qui ne serait pas le cas si x == True ou si x est Vrai. Voyant que la PEP 8 recommande vivement uniquement à l'aide de la si x: variante, quelqu'un peut-il expliquer pourquoi ce comportement se produit? Il semble que, si x est plus un test de "si x n'est pas Faux" ou "si x existe". Avec cela à l'esprit, je crois que je dois utiliser si x est Vrai: dans ce cas, en dépit de ce que PEP 8 a à dire.
Salutations
source d'informationauteur ssast
Vous devez vous connecter pour publier un commentaire.
Les valeurs suivantes en Python sont faux dans le contexte de
if
et d'autres logiques contextes:False
None
0
0.0
-0.0
''
etu''
__bool__
(en Python3) pour revenirFalse
ou__nonzero__
(en Python2) pour revenirFalse
ou0
.__bool__
(en Python3) ou__nonzero__
(en Python2), mais n'en œuvre__len__
pour renvoyer une valeur égale à 0Un objet est considéré comme "faux" si l'un de ceux qui s'applique, et "vrai", sinon, peu importe si c'est en fait égale ou identique à
False
ouTrue
Maintenant, si vous avez convenu que
x
est nécessairement l'un des objetsTrue
ouFalse
alors vous pouvez écrire en toute sécuritéif x
. Si vous avez disposé de manière que la "justesse" dex
indique si ou de ne pas effectuer l'opération, indépendamment de leur type, alors vous pouvez écrire en toute sécuritéif x
. Où vous pouvez écrire ce que vous préférez faire, car c'est un nettoyant pour le lire.Normalement, si elle est autorisée pour
x
de prendre la valeurTrue
ensuite, vous êtes dans l'un de ces deux cas, et si vous n'écrirez pasif x is True
. La chose importante est correctement document le sens dex
de sorte qu'il reflète le test utilisé dans le code.Python pour les programmeurs sont censés savoir ce qui est considéré comme vrai, donc si vous venez de document, "exécute la fonction si
x
est vrai", alors que l'expression de ce que votre code d'origine. Documentant, "exécute la fonction six is True
" aurait un sens différent, et est moins couramment utilisé en raison précisément de la règle de style dans PEP8 qui dit test pour l'uniformité, plutôt que la valeur spécifiqueTrue
.Toutefois, si vous voulez que le code se comportent différemment dans le cas où
x
est un conteneur vide dans le cas où il estNone
alors vous devez écrire quelque chose commeif x is not None
.Sont à la fois
True
D'autres valeurs de vérité.
Le document explique d'autres valeurs.
Autant que la PEP8 raison, il est beaucoup plus sémantique de lire
if this_file_is_green
Autres falsey valeurs comprennent
0
''
[]
. Vous devriez utiliser leif x:
version.La capacité de dire
est considéré comme une caractéristique. Vous pouvez également spécifier quand le test doit être considéré comme de passer ou non par l'utilisateur défini par les classes (il suffit de définir la méthode
__nonzero__
en Python 2.x ou__bool__
en Python 3).Par exemple pour les chaînes et les conteneurs comme des listes, des dictionnaires ou des ensembles de test
if x ...
signifie "si x n'est pas vide".Noter que la justification n'est pas que cela permet moins de code à écrire, mais que le code résultant est plus facile à lire et à comprendre.
Si vous aimez au lieu d'écrire
if x is True ...
avez-vous envisagé d'aller plus loin sur ce chemin pourif (x is True) is True ...
ouif ((x is True) is True) is True ...
? 🙂Il va sans dire que vous devriez écrire du code qui fait ce que vous avez besoin. Mais dans la plupart des cas, vous n'avez simplement pas besoin de dire
== True
ouis True
parce que vous n'avez pas besoin de distinguerTrue
d'autres "truthy" valeurs". Il est donc recommandé de quitter que pour des raisons de simplicité.Le cas où vous avez certainement devraient utiliser
== True
ouis True
est quand vous ne besoin de distinguerTrue
d'autres truthy valeurs.Dans votre exemple, vous préoccupez-vous de la différence entre
True
et123
? Que vous dire de quelle manière le code.Une chose à propos de codage
== True
ouis True
: elle soulèvera un mineur drapeau rouge quand d'autres développeurs de lire ton code. Ils ne pense pas que c'est mal, ils vont juste se demander pourquoi il est là et vous voulez savoir pourquoi il est important de traiterTrue
différemment des autres truthy valeurs dans ce cas particulier.En d'autres termes, si vous n'en avez pas besoin, il est préférable de ne pas l'utiliser.