Non Nessuno prova in Python [duplicato]
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é?
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