[TIP] Annotated tracebacks

holger krekel holger at merlinux.eu
Sun Oct 19 03:35:21 PDT 2014


On Sun, Oct 19, 2014 at 23:07 +1300, Robert Collins wrote:
> On 19 Oct 2014 21:38, "holger krekel" <holger at merlinux.eu> wrote:
> >
> > On Sat, Oct 18, 2014 at 22:52 +1300, Robert Collins wrote:
> > > testtools just had this bug opened on it:
> > >
> > > https://github.com/testing-cabal/testtools/issues/111
> > >
> > > Which has a few contributing issues but one in particular is that
> > > simple tracebacks don't give you the value of variables in parameters,
> > > nor of local variables in the trace.
> >
> > What do you mean with "variables in parameters"
> 
> 
> Ideally this code:
> 
> def calls():
>   called(1, 2)
> 
> def called(a,b):
>   a = 3
>   b = 4
>   1/0
> 
> would show something like:
> 
> param a=1
> param b=2
> local a=3
> local b=4
> 
> for the frame of called.

Would be nice.  How do you propose to capture the "param" part?

> > > I'm aware of the implementation details that can make showing those
> > > values fraught (since __str__ and __repr__ can execute arbitrary
> > > code), but I thought I'd do a straw poll here and see who supports the
> > > idea of the traceback module itself offering to format such things
> > > (e.g. via a locals=False parameter to format_list and friends), which
> > > testtools could then backport to older pythons, and use itself to do
> > > this.
> > >
> > > In terms of addressing the implementation details, my thoughts today
> > > are to render the traceback once in simple mode, and then once with
> > > variables, and if something throws during the variable render, just
> > > use the simple one.
> >
> > I am open to discuss what it takes to factor out or reimagine pytest's
> > traceback code (tested against py26-py34,pypy) so it becomes useable from
> > testtools.  You can see it in action with:
> 
> That would be great. Ideally I think this belongs in the stdlib in the
> traceback module. In a pinch testtools /could/ depend on py.test and
> bring it in, but I'd like to keep deps fairly shallow and focused on
> things where much of the functionality is used.
> 
> If you want I can prepare a patch to traceback based on your code, or you can.

I am not keen on including in stdlib first.  The place for things to be
adopted by the community is PyPI these days.  Which also helps to heal the
py2/py3 chasm.  It it's stable and used a lot it could go to stdlib later.
Anyway, let's first get the design/requirements right (see also question
above).  After that i can look at the code and suggest something.  
IIRC it has one abstraction layer more than is strictly needed
which originated from PyPy needs which i am not sure are still actual.

> >     py.test --tb=short,long,native [--full-trace] [--showlocals] somefile.py
> >
> > If somefile.py contains:
> >
> >     def test_function():
> >         i = 3
> >         assert i == 4
> >
> > While the code for the traceback code leaves things to be desired
> > (i wrote parts of it 8 years ago), it is quite battle tested because
> > it overtime incorporated tests and fixes for reported bugs.
> >
> > Note that the assertion expression code showing (values in expressions)
> > is not strictly related to traceback manipulation and can be manipulated
> > separately with "--assert=rewrite|plain|reinterp"
> 
> Yeah- the assert stuff is very distinctively py.test, and its
> something I'd propose we consider separately ;)

Sure.  I'd just like to make sure you know that pytest is since years
not using "re-interpretation" but AST-rewriting such that expressions
are not evaluated twice :)

best,
holger



More information about the testing-in-python mailing list