io possa essere di essere un po 'pedanti qui, ma direi che la risposta migliore è
if my_var is not None and 'something' in my_var:
#do something
La differenza è il controllo esplicito per None
, piuttosto che la conversione implicita di my_var
-True
o False
.
Mentre sono sicuro che nel tuo caso la distinzione non è importante, nel caso più generale sarebbe del tutto possibile per la variabile di non essere None
ma ancora valutare a False
, ad esempio un valore intero di 0
o una lista vuota.
Quindi, contrariamente alla maggior parte delle affermazioni degli altri utenti che è sicuro, direi che è sicuro finché sei esplicito. Se non siete convinti quindi prendere in considerazione questa classe molto artificiosa:
class Contrived(object):
def __contains__(self, s):
return True
def __nonzero__(self):
return False
my_var = Contrived()
if 'something' in my_var:
print "Yes the condition is true"
if my_var and 'something' in my_var:
print "But this statement won't get reached."
if my_var is not None and 'something' in my_var:
print "Whereas this one will."
Sì, lo so che non è un esempio realistico, ma le variazioni accadono nel codice vero e proprio, soprattutto quando None
viene utilizzato per indicare un argomento di funzione di default.
fonte
2009-09-01 11:37:32
Quando vedo il codice come il secondo, presumo che il codificatore non abbia capito come funziona la valutazione di cortocircuito. – Dana
-1: Nessuna citazione dalla documentazione: http://docs.python.org/library/stdtypes.html#boolean-operations-and-or-not –
@cfi: Poiché posso modificare il mio voto dopo che la risposta è cambiata, Non sono chiaro su quale sia il problema. –