web-dev-qa-db-fra.com

Booléen Python - si x :, vs si x == True, vs si x est True

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

19
ssast

Les valeurs suivantes dans Python sont false dans le contexte de if et d'autres contextes logiques:

  • False
  • None
  • valeurs numériques égales à 0, telles que 0, 0.0, -0.0
  • chaînes vides: '' et u''
  • des conteneurs vides (tels que des listes, des n-uplets et des dictionnaires)
  • tout ce qui implémente __bool__ (en Python3) pour renvoyer False ou __nonzero__ (en Python2) pour renvoyer False ou 0.
  • tout ce qui n'implémente pas __bool__ (en Python3) ou __nonzero__ (en Python2), mais implémente __len__ pour renvoyer une valeur égale à 0

Un 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.

26
Steve Jessop
x = 'False'
x = 123

Sont tous les deux True

Autres valeurs de vérité.

Le document explique d'autres valeurs.

En ce qui concerne la raison PEP8, son beaucoup plus sémantique à lire if this_file_is_green 

3
Jakob Bowyer

Les autres valeurs de Falsey incluent 0, '', []. Vous devriez simplement utiliser la version if x:.

1
U2EF1

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.

1
Michael Geary

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 ...? :-)

0
6502