<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 14px; "><div><div><div style="font-family: Calibri, sans-serif; ">If finalizations are objects, is there any reason you can't make the finalization object have an unregister method, like below? Or does this not address the problem?</div><div style="font-family: Calibri, sans-serif; "><br></div><div style="font-family: Calibri, sans-serif; ">    >>> class Kenny: pass<br>    ...<br>    >>> kenny = Kenny()<br>    >>> f = finalize(kenny, print, "you killed kenny!")</div><div style="font-family: Calibri, sans-serif; ">    >>> f<br>    <finalize.finalize object at 0xffed4f2c></div><div style="font-family: Calibri, sans-serif; ">    >>> f.unregister()</div><div style="font-family: Calibri, sans-serif; ">    >>> del kenny<br></div><div style="font-family: Calibri, sans-serif; ">    >>></div><div style="font-family: Calibri, sans-serif; "><br></div><div><div style="font-family: Calibri, sans-serif; "><font class="Apple-style-span" color="rgb(0, 0, 0)"><font class="Apple-style-span" face="Calibri">Matthew Lefavor</font></font></div><div><br></div></div></div></div><span id="OLK_SRC_BODY_SECTION" style="font-family: Calibri, sans-serif; "><div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt"><span style="font-weight:bold">From: </span> Brett Cannon <<a href="mailto:brett@python.org">brett@python.org</a>><br><span style="font-weight:bold">Date: </span> Wednesday, August 1, 2012 11:25 AM<br><span style="font-weight:bold">To: </span> "<a href="mailto:ironfroggy@gmail.com">ironfroggy@gmail.com</a>" <<a href="mailto:ironfroggy@gmail.com">ironfroggy@gmail.com</a>><br><span style="font-weight:bold">Cc: </span> Richard Oudkerk <<a href="mailto:shibturn@gmail.com">shibturn@gmail.com</a>>, "<a href="mailto:python-ideas@python.org">python-ideas@python.org</a>" <<a href="mailto:python-ideas@python.org">python-ideas@python.org</a>><br><span style="font-weight:bold">Subject: </span> Re: [Python-ideas] Better support for finalization with weakrefs<br></div><div><br></div><br><br><div class="gmail_quote">On Tue, Jul 31, 2012 at 9:28 AM, Calvin Spealman <span dir="ltr"><<a href="mailto:ironfroggy@gmail.com" target="_blank">ironfroggy@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Jul 30, 2012 at 12:44 PM, Richard Oudkerk <<a href="mailto:shibturn@gmail.com">shibturn@gmail.com</a>> wrote:<br>
> I would like to see better support for the use of weakrefs callbacks<br>
> for object finalization.<br>
><br>
> The current issues with weakref callbacks include:<br>
><br>
> 1. They are rather low level, and working out how to use them<br>
>    correctly requires a bit of head scratching.  One must find<br>
>    somewhere to store the weakref till after the referent is dead, and<br>
>    without accidentally keeping the referent alive.  Then one must<br>
>    ensure that the callback frees the weakref (without leaving any<br>
>    remnant ref-cycles).<br>
><br>
>    When it is an option, using a __del__ method is far less hassle.<br>
><br>
> 2. Callbacks invoked during interpreter shutdown are troublesome.  For<br>
>    instance they can throw exceptions because module globals have been<br>
>    replaced by None.<br>
><br>
> 3. Sometimes you want the callback to be called at program exit even<br>
>    if the referent is still alive.<br>
><br>
> 4. Exceptions thrown in callbacks do not produce a traceback.  This<br>
>    can make debugging rather awkward.  (Maybe this is because printing<br>
>    tracebacks is problematic during interpreter shutdown?)<br>
><br>
> (Note that problems 2-4 also apply to using __del__ methods.)<br>
><br>
> If possible I would like to see the weakref module provide a finalize<br>
> class to address these issues.  Trivial usage might be<br>
><br>
>     >>> class Kenny: pass<br>
>     ...<br>
>     >>> kenny = Kenny()<br>
>     >>> finalize(kenny, print, "you killed kenny!")<br>
>     <finalize.finalize object at 0xffed4f2c><br>
>     >>> del kenny<br>
>     you killed kenny!<br>
><br>
> Prototype at <a href="https://gist.github.com/3208245" target="_blank">https://gist.github.com/3208245</a><br><br></div></div>I like how simple it is, but it might be too simple. That is,<br>
shouldn't we have a way to unregister the callback?</blockquote><div><br></div><div>You can't unregister a __del__ method, so why should that stop this from moving forward? And if you really need that then you just have the cleanup code check something to see if it should run or not or just use some form of delegation.</div></div></span></body></html>