web-dev-qa-db-fra.com

Python: sinon val, vs si val est None

J'ai toujours codé dans le style de if not value cependant, quelques guides ont attiré mon attention sur le fait que même si ce style fonctionne, il semble avoir deux problèmes potentiels:

  1. Ce n'est pas complètement lisible; if value is None est sûrement plus compréhensible.
  2. Cela peut avoir des implications plus tard (et provoquer des bugs subtils), car des choses comme [] et 0 sera également évalué en False.

Je commence également à appliquer cette idée à d'autres comparaisons, telles que:

  • if not value contre if value is False
  • if not value contre if value is []

Et ainsi va la liste ...

La question est de savoir jusqu'où allez-vous avec le principe? Où tracer la ligne, tout en gardant votre code en sécurité?

Dois-je toujours utiliser le if value is None le style quoi qu'il en soit?

53
John Doe

Utilisez une comparaison avec Aucun si c'est ce que vous voulez. Utilisez "sinon valeur" si vous voulez simplement vérifier si la valeur est considérée comme fausse (liste vide, aucune, fausse).

Je trouve que "sinon la valeur" est plus propre et plus pythonique.

Faites également attention aux listes. Vous ne devez pas utiliser la fonction de comparaison pour une liste vide. Si vous savez que vous obtenez une liste, utilisez "si" pour vérifier si elle contient du contenu (ou len ()). Essayez de taper ceci dans l'interpréteur:

>>> a = []
>>> a is []
False

En effet, la liste temporaire que vous venez de créer a une adresse en mémoire différente de celle stockée en "a". Vous ne voyez pas cela avec None, False ou True car ce sont toutes des valeurs qui sont des singletons (elles se réfèrent toutes à la même section de la mémoire), donc l'utilisation du mot-clé 'is' fonctionne.

Vous constaterez également que CPython stagiaires chaînes de sorte que le fonctionnement suivant.

>>> 'a' is 'a'
True

Vous devez pas vous y fier. Il s'agit d'un détail d'implémentation qui n'est pas spécifié pour fonctionner avec toutes les versions de Python.

24
Jonathan Sternberg

Non. Si vous souhaitez exécuter du code lorsque la valeur est fausse mais n'est pas None, cela échouerait horriblement.

Utilisation is None si vous vérifiez l'identité avec l'objet None. Utilisation not value si vous voulez juste que la valeur soit False.

25
Wooble

Votre utilisation de l'opérateur is est un peu problématique. if value is [] sera toujours faux, par exemple, car deux listes actives n'ont pas la même identité. Cela fonctionne très bien avec None parce que None est un singleton (toutes les références à None sont le même objet) mais pour d'autres comparaisons, utilisez ==.

Cependant, if value et if not value sont parfaitement lisibles et utiles. À mon humble avis, il n'est pas nécessaire d'être plus spécifique, à moins que vous devez traiter différents types de valeurs véridiques ou fausses, comme, par exemple, en faisant la distinction entre 0 et None.

4
kindall

Ma réponse est simple, car elle s'applique à la plupart des problèmes de codage: n'essayez pas d'écrire quelque chose qui fonctionne. Essayez d'exprimer votre intention aussi clairement que possible. Si vous souhaitez vérifier si une valeur est fausse, utilisez if not value. Si vous souhaitez rechercher None, notez-le. Cela dépend toujours de la situation et de votre jugement.

Vous ne devriez pas essayer de trouver des règles qui peuvent être appliquées sans réfléchir. Si vous trouvez ces règles, c'est un travail pour un ordinateur, pas pour un humain! ;-)

3
Achim
if not value:
    pass

est bien et "Pythonic". Cela ne cause pas de bugs subtils, les règles sont explicites et (je trouve) facile à comprendre .

Si vous devez faire la différence entre faux et aucun, comme vous l'avez mentionné, utilisez:

if not value is None:  # or False, or == [], etc.
    pass

# more readable
if value is not None:  # or False, or != [], etc.
    pass

Je trouve cependant que ce qui précède est rarement nécessaire.

En général, il est préférable de créer des conditions positives et de les placer en premier. Ils sont plus faciles à comprendre en un coup d'œil et résistent bien lorsque la complexité augmente (comme cela semble toujours le cas).

if value:
    pass
else:
    pass
1
Gringo Suave