Out of these not None tests.
if val != None: if not (val is None): if val is not None:
Which one is preferable, and why?
Either of the latter two, since
val could potentially be of a type that defines
__eq__() to return true when passed
if val is not None: # ...
is the Pythonic idiom for testing that a variable is not set to
None. This idiom has particular uses in the case of declaring keyword functions with default parameters.
is tests identity in Python. Because there is one and only one instance of
None present in a running Python script/program,
is is the optimal test for this. As Johnsyweb points out, this is discussed in PEP 8 under “Programming Recommendations”.
As for why this is preferred to
if not (val is None): # ...
From, Programming Recommendations, PEP 8:
Comparisons to singletons like None should always be done with
is not, never the equality operators.
Also, beware of writing
if xwhen you really mean
if x is not None— e.g. when testing whether a variable or argument that defaults to None was set to some other value. The other value might have a type (such as a container) that could be false in a boolean context!
PEP 8 is essential reading for any Python programmer.
The best bet with these types of questions is to see exactly what python does. The
dis module is incredibly informative:
>>> import dis >>> dis.dis("val != None") 1 0 LOAD_NAME 0 (val) 2 LOAD_CONST 0 (None) 4 COMPARE_OP 3 (!=) 6 RETURN_VALUE >>> dis.dis("not (val is None)") 1 0 LOAD_NAME 0 (val) 2 LOAD_CONST 0 (None) 4 COMPARE_OP 9 (is not) 6 RETURN_VALUE >>> dis.dis("val is not None") 1 0 LOAD_NAME 0 (val) 2 LOAD_CONST 0 (None) 4 COMPARE_OP 9 (is not) 6 RETURN_VALUE
As pointed out by other answers, using
!= when comparing with
None is a bad idea.