[Python-ideas] breaking cycles that include __del__

Antoine Pitrou solipsis at pitrou.net
Wed Oct 21 00:34:15 CEST 2009


Scott Dial <scott+python-ideas at ...> writes:
> 
> This is made clear in the gcmodule.c comments, but is severely lacking
> from the actual documentation in the weakref module. But also, Antoine's
> is flawed in the same manner.

You're right, I've been too quick in posting this.
The following works, however:

import weakref, gc
class Foo:
    _w = {}
    def __init__(self):
        k = id(self)  
        def not_closed(_, d=Foo._w, k=k, r=repr(self)):
            del d[k]
            print ("%s not closed!" % r)
        Foo._w[k] = weakref.ref(self, not_closed)

    def close(self):
        # Close...
        # and then destroy weakref
        Foo._w.pop(id(self), None)

x,y = Foo(), Foo()
x.y, y.x = y, x
y.close()
del x
del y
gc.collect()
print(gc.garbage)


Cheers

Antoine.





More information about the Python-ideas mailing list