<div class="gmail_quote">On 28 June 2010 04:00, Antoine Pitrou <span dir="ltr"><<a href="mailto:solipsis@pitrou.net">solipsis@pitrou.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On Sun, 27 Jun 2010 19:20:07 +0200<br>
<div class="im">"M.-A. Lemburg" <<a href="mailto:mal@egenix.com">mal@egenix.com</a>> wrote:<br>
><br>
</div><div class="im">> Not necessarily roll back the feature, but an implementation<br>
> that deliberately introduces circular references is not really<br>
> ideal.<br>
><br>
> Since tracebacks on exceptions are rarely used by applications,<br>
> I think it would be better to turn them into weak references.<br>
<br>
</div>How do you manage to get a strong reference before the traceback object<br>
gets deleted?<br></blockquote><div><br></div><div>At the beginning of the 'except' block, a strong local (but hidden) reference is obtained to the traceback (if it exists). This is deleted at the end of the 'except' block.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Besides, an API which gives some information in an unreliable manner<br>
does not seem very user-friendly to me.<br>
<br>
I think I like the OP's idea better: allow to release the references to<br>
local and global variables from the frames in the traceback. This is<br>
keeps a lot of potentially large objects alive - some of which may also<br>
keep some OS resources busy.</blockquote><div><br></div><div>I agree, with a variation - keep a weak reference to the frame in the traceback, and have a way for the application to specify that it wants to retain strong references to frames (so unittest for example can guarantee access to locals and globals).┬áPossibly a context manager could be used for this, and decorators could be used to wrap an entire method in the context manager.</div>
<div><br></div><div>A dummy frame would also be stored that contained enough info to replicate the existing stack trace (file, line number, etc). A┬ástrong reference could be obtained via the existing attribute, converted to a property, which does:</div>
<div><br></div><div>a. return the internal reference if it is not a dummy frame;</div><div>b. return the result of the weak reference if it still exists;</div><div>c. return the dummy frame reference.</div><div><br></div>
<div>I think this gives us the best of all worlds:</div><div><br></div><div>1. No strong reference to locals/globals in tracebacks by default;</div><div><br></div><div>2. Able to force strong references to frames;</div><div>
<br></div><div>3. We don't lose the ability to compose a full and complete stack trace.</div><div><br></div><div>Tim Delaney</div></div>