803 votes

test not None en Python

Parmi ceux-ci, aucun test.

if val != None:

if not (val is None):

if val is not None:

Lequel est préférable, et pourquoi ?

0 votes

Et si if val: ?

7 votes

Ce n'est pas le même test ! C'est if sera faux si val est 0, "", [], 0.0. etc. ainsi que si elle est None.

1158voto

gotgenes Points 8667
if val is not None:
    # ...

est l'idiome pythonique pour tester qu'une variable n'est pas définie sur None . Cet idiome a des utilisations particulières dans le cas de déclaration de fonctions de mots-clés avec des paramètres par défaut . is teste l'identité en Python. Parce qu'il existe une et une seule instance de None présent dans un script/programme Python en cours d'exécution, is est le test optimal pour cela. Comme Johnsyweb fait remarquer Cette question est abordée dans PEP 8 sous la rubrique "Recommandations de programmation".

Quant à la raison pour laquelle cette solution est préférée à

if not (val is None):
    # ...

cela fait simplement partie de la Zen du python : "La lisibilité compte." Un bon Python est souvent proche d'un bon pseudo-code .

66 votes

De plus, "n'est pas" a une sémantique spéciale créée dans ce but (ce n'est pas une conséquence logique de la façon dont les expressions sont construites ; "1 est (pas None)" et "1 n'est pas None" ont deux résultats différents.

2 votes

"not None" renvoie à True. Intéressant.

0 votes

@gotgenes Pas toujours raison. Par exemple : var = ''. Si vous exécutez ce code, il teste avec succès la variable None. Par conséquent, vous n'êtes pas en mesure de tester si la variable a été définie sur None ou sur une chaîne vide.

127voto

Johnsyweb Points 45395

De, Recommandations de programmation, PEP 8 :

Les comparaisons avec des singletons comme None doivent toujours être faites avec is ou is not jamais les opérateurs d'égalité.

Méfiez-vous également de l'écriture if x quand tu veux vraiment if x is not None - Par exemple, lorsqu'on teste si une variable ou un argument dont la valeur par défaut est None a pris une autre valeur. L'autre valeur pourrait avoir un type (tel qu'un conteneur) qui pourrait être faux dans un contexte booléen !

PEP 8 est une lecture essentielle pour tout programmeur Python.

29voto

Nirk Points 9999

Pour ce type de questions, le mieux est de voir ce que fait exactement python. Le site dis est incroyablement instructif :

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

Remarquez que les deux derniers cas se réduisent à la même séquence d'opérations, Python se lit comme suit not (val is None) et utilise le is not opérateur . Le premier utilise le != opérateur en comparaison avec None .

Comme l'ont souligné d'autres réponses, l'utilisation de != en comparaison avec None est une mauvaise idée.

0 votes

Quelle est la différence entre compare_op 9 et 3 ?

2 votes

@evolvedmicrobe De la dis doc ( https://docs.python.org/3/library/dis.html ), COMPARE_OP effectue l'opération booléenne correspondant au tuple dis.cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is not', 'exception match', 'BAD') . Donc COMPARE_OP 9 réalise is not et COMPARE_OP 3 réalise != .

25voto

L'un ou l'autre des deux derniers, puisque val pourrait potentiellement être d'un type qui définit __eq__() pour retourner vrai quand on lui passe None .

4 votes

C'est plutôt ignoble. __eq__() comportement, et quelque chose que je n'avais pas considéré. Bonne réponse pour attraper un cas particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X