"if x == None" raises "'NoneType' object is not callable"

gbreed at cix.compulink.co.uk gbreed at cix.compulink.co.uk
Mon Sep 16 15:23:05 CEST 2002


Luc Saffre wrote:

> Strange! Nobody told you to call 'None'! Who knows an explanation?

You have an error here:

>       except KeyError,e:
>          AttributeError,str(e)

You presumably intend to raise that AttributeError.  Here's a corrected 
version with some error reporting:

>>> class Row:
...     def __init__(self):
...             self.__dict__["_values"] = {}
...     def __getattr__(self, name):
...             try:
...                     return self._values[name]
...             except KeyError, e:
...                     print "tried to get", name
...                     raise AttributeError, str(e)
...     def __setattr__(self, name, value):
...             self.__dict__["_values"][name] = value
... 
>>> row = Row()
>>> row is None
0
>>> row == None
tried to get __eq__
tried to get __coerce__
tried to get __cmp__
0

Without the "raise", __getattr__ returns None for __eq__, and the 
interpreter then tries to call it.  Note that "is None" doesn't have this 
problem.


                      Graham



More information about the Python-list mailing list