[Python-Dev] Garbage collecting closures

Paul Prescod paul@prescod.net
Mon, 14 Apr 2003 14:41:31 -0700

Guido van Rossum wrote:
> Paul, would finalizers have been run if you had included an explicit
> gc.collect() call?
> If so, I'd say that a sufficiently portable rule is that you can't
> trust finalizers to run until GC is run (in Jython, gc.collect() isn't
> how it is invoked though).

Yes, now that I know to try it, gc.collect() would have fixed the problem.

But I'm not sure where I would have learned to do so. The documentation 
for __del__ is out of date.

  * http://www.python.org/doc/2.3a2/ref/customization.html

The documentation lists a variety of reasons that __del__ might not get 
called (it doesn't claim to be exhaustive but it does list some cases 
that I consider pretty obscure). It doesn't list nested recursive functions.

One strategy is to update the __del__ and gc documentation to add this 
case. Another strategy is to update the __del__ documentation to say: 
"if you want this to be executed deterministically in CPython, call 
gc.collect()". Or both.

  Paul Prescod