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:
if value is None
est sûrement plus compréhensible.[]
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?
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.
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.
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
.
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! ;-)
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