On Mon, Jul 30, 2012 at 12:44 PM, Richard Oudkerk <
shibturn@gmail.com> wrote:
> 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