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