'Using is not None, may not always work'

Peter Otten __peter__ at web.de
Fri Aug 6 11:02:43 EDT 2004


Doug Fort wrote:

> Since I installed 2.4a2 I've been getting a warning from pychecker: Using
> is not None, may not always work'. I thought 'is not None' was the right
> thing to do. I've had problems with 'if not x:', because some objects
> return False in this context.
 
This is harmless. Starting with 2.4a2 None is a constant:

Python 2.3.3 (#1, Jan  3 2004, 13:57:08)
[GCC 3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def f():
...     if x is None: pass
...
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (x)
              3 LOAD_GLOBAL              1 (None)
              6 COMPARE_OP               8 (is)
              9 JUMP_IF_FALSE            4 (to 16)
             12 POP_TOP
             13 JUMP_FORWARD             1 (to 17)
        >>   16 POP_TOP
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE
>>>

Python 2.4a2 (#1, Aug  6 2004, 16:38:38)
[GCC 3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
[python 2.4a2]
>>> import dis
>>> def f():
...     if x is None: pass
...
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               8 (is)
              9 JUMP_IF_FALSE            4 (to 16)
             12 POP_TOP
             13 JUMP_FORWARD             1 (to 17)
        >>   16 POP_TOP
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE


When PyChecker sees the constant it supposes you are doing something like

if x is "some string": pass

which always had the LOAD_CONST op-code and is indeed dangerous. PyChecker
needs to be fixed to special-case None for 2.4.

Peter





More information about the Python-list mailing list