non test Aucun en Python [double]
Question
Cette question a déjà une réponse ici:
Hors de ces tests Aucun.
if val != None:
if not (val is None):
if val is not None:
Lequel est préférable, et pourquoi?
La solution
if val is not None:
# ...
est l'idiome Pythonic pour tester qu'une variable n'est pas réglé sur None
. Cet idiome a des utilisations particulières dans le cas de déclarant fonctions de mots clés avec les paramètres par défaut . Tests is
identité en Python. Parce qu'il ya une et une seule instance de présent None
dans un script / programme Python en cours d'exécution, is
est le test optimal pour cela. Comme Johnsyweb points sur , cela est discuté dans PEP 8 sous "Recommandations de programmation".
Pour ce qui est pourquoi il est préféré
if not (val is None):
# ...
est tout simplement partie de la Zen de Python : « compte Lisibilité « . Bon Python est souvent proche de bon pseudocode.
Autres conseils
De, Recommandations de programmation, PEP 8 :
Les comparaisons à singletons comme Aucun devrait toujours être fait avec « Est » ou « non », jamais les opérateurs d'égalité.
En outre, méfiez-vous d'écrire « si x » quand vous vraiment dire « si x est None » -- par exemple. lors du test si une variable ou argument par défaut Aucun a été réglé sur une autre valeur. L'autre valeur peut avoir un type (Par exemple un récipient) qui pourrait être faux dans un contexte booléen!
PEP 8 est une lecture essentielle pour tout programmeur Python.
Soit des deux derniers, étant donné que val
pourrait être d'un type qui définit __eq__()
retourner true lorsqu'il None
.
Le meilleur pari avec ce genre de questions est de voir exactement ce que fait python. Le module dis
est très instructif:
>>> def f(val):
... if val != None:
... return True
... return False
...
>>> def g(val):
... if not (val is None):
... return True
... return False
...
>>> def h(val):
... if val is not None:
... return True
... return False
...
>>> import dis
>>> dis.dis(f)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 3 (!=)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(h)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
Notez que les deux derniers cas, réduire à la même séquence d'opérations (python lit not (val is None)
et utilise l'opérateur is not
). Les premières utilisations de l'opérateur !=
lorsque l'on compare avec aucune.
Comme indiqué par d'autres réponses, en utilisant !=
lorsque l'on compare avec None est une mauvaise idée