[Python-ideas] Better support for finalization with weakrefs

Richard Oudkerk shibturn at gmail.com
Mon Jul 30 18:44:09 CEST 2012


I would like to see better support for the use of weakrefs callbacks
for object finalization.

The current issues with weakref callbacks include:

1. They are rather low level, and working out how to use them
    correctly requires a bit of head scratching.  One must find
    somewhere to store the weakref till after the referent is dead, and
    without accidentally keeping the referent alive.  Then one must
    ensure that the callback frees the weakref (without leaving any
    remnant ref-cycles).

    When it is an option, using a __del__ method is far less hassle.

2. Callbacks invoked during interpreter shutdown are troublesome.  For
    instance they can throw exceptions because module globals have been
    replaced by None.

3. Sometimes you want the callback to be called at program exit even
    if the referent is still alive.

4. Exceptions thrown in callbacks do not produce a traceback.  This
    can make debugging rather awkward.  (Maybe this is because printing
    tracebacks is problematic during interpreter shutdown?)

(Note that problems 2-4 also apply to using __del__ methods.)

If possible I would like to see the weakref module provide a finalize
class to address these issues.  Trivial usage might be

     >>> class Kenny: pass
     ...
     >>> kenny = Kenny()
     >>> finalize(kenny, print, "you killed kenny!")
     <finalize.finalize object at 0xffed4f2c>
     >>> del kenny
     you killed kenny!

Prototype at https://gist.github.com/3208245

Cheers,

Richard




More information about the Python-ideas mailing list