Domanda

    

Questa domanda ha già una risposta qui:

         

Da questi test non Nessuno.

if val != None:

if not (val is None):

if val is not None:

Quale è preferibile, e perché?

È stato utile?

Soluzione

if val is not None:
    # ...

è il linguaggio Pythonic per verificare che una variabile non è impostata None. Questo linguaggio ha particolari usi nel caso di dichiara funzioni chiave con parametri di default . is test d'identità in Python. Poiché c'è una e una sola istanza di None presente in una esecuzione Python script / programma, is è il test ottimale per questo. Come Johnsyweb punti su , questo è discusso nella PEP 8 sotto "Raccomandazioni di programmazione".

Per quanto riguarda il motivo per cui questo si preferisce

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

questo è semplicemente parte del Zen di Python : "conta leggibilità ". Buona Python è spesso vicino alla buona pseudocodice .

Altri suggerimenti

Da, Raccomandazioni di programmazione, PEP 8 :

  

I paragoni con single come nessuno dovrebbe sempre essere fatto con   'È' o 'non è', mai gli operatori di uguaglianza.

     

Inoltre, fate attenzione di scrivere "se x" quando realmente significano "se x non è None"   -- per esempio. quando si verifica se una variabile o argomento che per impostazione predefinita   Nessuno è stato impostato su un altro valore. L'altro valore potrebbe avere un tipo   (Come ad esempio un contenitore) che potrebbe essere falso in un contesto booleano!

PEP 8 è una lettura essenziale per ogni programmatore Python.

Uno di questi ultimi due, dato val potrebbe potenzialmente essere di un tipo che definisce __eq__() restituire true quando passata None.

La cosa migliore con questo tipo di domande è quello di vedere esattamente ciò che fa pitone. Il modulo dis è incredibilmente informativo:

>>> 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

Si noti che gli ultimi due casi riducono alla stessa sequenza di operazioni (Python legge not (val is None) e utilizza l'operatore is not). I primi utilizzi l'operatore != quando si confrontano con nessuno.

Come sottolineato da altre risposte, utilizzando != quando si confrontano con Nessuno è una cattiva idea

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top