a Python bug in processing __del__ method ??
Steven Bethard
steven.bethard at gmail.com
Mon Jan 31 02:11:52 EST 2005
Fredrik Lundh wrote:
> Baoqiu Cui wrote:
>
>>The error returned is this:
>>
>>$ python bug.py
>>Exception exceptions.AttributeError: "'NoneType' object has no
>>attribute 'population'" in <bound method Person.__del__ of
>><__main__.Person instance at 0xa0c9fec>> ignored
>>
>>However, if I rename variable name 'peter' to something like 'peter1'
>>or 'david', the error is gone. Looks to me the
>>error only happens to variable name 'peter'.
>>
>>Does anyone know what is wrong? Is this a bug only on Cygwin?
>
> it is not a bug, and the documentation has the answer:
>
> language reference -> index -> __del__
>
> http://docs.python.org/ref/customization.html#l2h-175
>
> Warning: Due to the precarious circumstances under which __del__()
> methods are invoked, exceptions that occur during their execution are
> ignored, and a warning is printed to sys.stderr instead. Also, when
> __del__() is invoked in response to a module being deleted (e.g.,
> when execution of the program is done), other globals referenced by
> the __del__() method may already have been deleted. For this reason,
> __del__() methods should do the absolute minimum needed to
> maintain external invariants.
>
> if you absolutely need to have reliable access to globals, you need to make
> sure they're available as instance variables, or are bound in some other way.
Along these lines, I think changing your code to:
class Person(object):
population = 0
def __del__(self):
self.__class__.population -= 1
peter = Person()
solves the problem. (At least it did for me.)
Steve
More information about the Python-list
mailing list