[Python-ideas] breaking cycles that include __del__

Arnaud Delobelle arnodel at googlemail.com
Sat Oct 17 18:01:48 CEST 2009


On 17 Oct 2009, at 15:34, Daniel Stutzbach wrote:

> Right now, the presence of __del__ method prevents cycles from being  
> collected.  It is possible for an application to rummage through  
> gc.garbage and break links between objects.  However, for a large  
> application this may be inefficient or inelegant for several reasons:
>
> - It may be most natural to break the links on objects of type Foo,  
> even though Foo is a minority of items (e.g., if Foo is parent node  
> with many children).
>
> - It's difficult to know how frequently to sift through the garbage
>
> - Third-party package may create noncollectable garbage that we need  
> to sift through, even though we don't know how to safely break links  
> on their objects.
>
> - If every package sifts through the garbage independently, there's  
> a lot of extra work going on.
>
> I propose the following simple solution.  When the garbage collector  
> is about to add an object to gc.garbage, it checks to see if the  
> object has a __clear__ method.  If so, the garbage collector calls  
> it, giving the object an opportunity to safely break any cycles it  
> may be in.  If it breaks the cycles, great!  The object can now  
> safely be collected and __del__ will eventually be called.  If not,  
> then the object gets added to gc.garbage after all and no harm is  
> done.
>
> It would be simple to implement, efficient, and the cognitive load  
> for the programmer using __del__ and __clear__ is small.
>
> Thoughts?

I remember a thread about this on comp.lang.python in March:

http://mail.python.org/pipermail/python-list/2009-March/174419.html

-- 
Arnaud





More information about the Python-ideas mailing list