'not None test in Python [duplicate]
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?
Solution 1:[1]
From, Programming Recommendations, PEP 8:
Comparisons to singletons like None should always be done with
isoris not, never the equality operators.Also, beware of writing
if xwhen you really meanif 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.
Solution 2:[2]
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
Notice that the last two cases reduce to the same sequence of operations, Python reads not (val is None) and uses the is not operator. The first uses the != operator when comparing with None.
As pointed out by other answers, using != when comparing with None is a bad idea.
Solution 3:[3]
Either of the latter two, since val could potentially be of a type that defines __eq__() to return true when passed None.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Community |
| Solution 2 | Boris Verkhovskiy |
| Solution 3 | Ignacio Vazquez-Abrams |
