On Mon, Sep 18, 2017 at 2:48 AM, Antoine Pitrou <solipsis@pitrou.net> wrote:
On Mon, 18 Sep 2017 11:31:12 +0200
Victor Stinner <victor.stinner@gmail.com> wrote:
>
> Ideally, CPython 3.x should never create reference cycles. Removing
> Exception.__traceback__ is the obvious "fix" for the issue. But I
> expect that slowly, a lot of code started to rely on the attribute,
> maybe even for good reasons :-)

The real issue is not reference cycles, but the fact that a traceback
frame keeps all locals alive.  When the frame's execution is finished,
that information is practically almost always useless, but is kept for
the rare cases of debugging (and perhaps dubious features such as
some of py.test's magic).  So we're constantly paying the price of this
minor, albeit probably useful (*), debugging-related feature with
annoying object lifetime issues that are sometimes quite difficult to
track down and solve.

(*) (I've hardly ever used pdb so I don't know if people often examine
the locals of finished frames, but I suppose some do)

Yes, that's what `pdb.pm()` is for.
 
Perhaps it would be useful to have a way to tell the interpreter to
automatically clear all locals on frames when they have finished
executing.  It could be a thread-local setting (or, better, a PEP 550
context variable setting).

In Python 2 the traceback was not part of the exception object because there was (originally) no cycle GC. In Python GC we changed the awkward interface to something more useful, because we could depend on GC. Why are we now trying to roll back this feature? We should just improve GC. (Or perhaps you shouldn't be raising so many exceptions. :-)

--
--Guido van Rossum (python.org/~guido)