Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

'Using is not None, may not always work'

3 views
Skip to first unread message

Doug Fort

unread,
Aug 6, 2004, 9:15:27 AM8/6/04
to
Hi,

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.

--
Doug Fort, Consulting Programmer
http://www.dougfort.com

Heiko Wundram

unread,
Aug 6, 2004, 10:12:14 AM8/6/04
to pytho...@python.org
Am Freitag, 6. August 2004 15:15 schrieb Doug Fort:
> 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.

That's probably what pychecker warns you about: that you might get an object
in the respective context which evaluates to boolean false, but is not
None... Although I'd find this strange...

Heiko.

Michael Hudson

unread,
Aug 6, 2004, 10:16:25 AM8/6/04
to
Heiko Wundram <hei...@ceosg.de> writes:

Does seem an odd warning, seeing as when I write "x is not None" I'm
generally avoiding the case of, e.g., x being the empty list.

Cheers,
mwh

--
Well, you pretty much need Microsoft stuff to get misbehaviours
bad enough to actually tear the time-space continuum. Luckily
for you, MS Internet Explorer is available for Solaris.
-- Calle Dybedahl, alt.sysadmin.recovery

Grant Edwards

unread,
Aug 6, 2004, 10:54:07 AM8/6/04
to
On 2004-08-06, Doug Fort <doug...@dougfort.com> wrote:

> Since I installed 2.4a2 I've been getting a warning from
> pychecker: Using is not None, may not always work'.

Huh?!

That implies that there are cases where "None is not None" will
evaluate as True. I find that extremely hard to believe.

> I thought 'is not None' was the right thing to do.

It's certainly what I want to do if I want to know if a name is
bound to None or not.

> I've had problems with 'if not x:', because some objects
> return False in this context.

Exactly.

--
Grant Edwards grante Yow! I was in a HOT
at TUB! I was NORMAL! I was
visi.com ITALIAN!! I enjoyed th'
EARTHQUAKE!

Peter Otten

unread,
Aug 6, 2004, 11:02:43 AM8/6/04
to
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


Doug Fort

unread,
Aug 6, 2004, 11:06:29 AM8/6/04
to
On Fri, 06 Aug 2004 17:02:43 +0200, Peter Otten wrote:

> 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:

Thanks, that it.

--

0 new messages