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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top