Want to see more precisely where you are or were at in a traceback or callstack your Python code has several places in a line it could have errored? Even if the code was something created at runtime with say eval or exec or if there was no source code that can be found?
Then this package is for you.
Some examples of the kinds of code this module can disambiguate:
i / j / k # which divide?
prev[prev[0]] # which prev ?
[e[0] for i in d[j] if got[i] == e[i]] # lots going on here
exec(some_code % 10, namespace) # code at runtime
Some example output given by running code in example:
Division example:
Traceback (most recent call last):
File "tb-div.py", line 9, in <module> at offset 52
a / b / c
a / b / c
-
ZeroDivisionError: float division by zero
List comprehension example:
File "tb-comp.py", line 9, in <listcomp> at offset 18
[e[0] for i in d[j] if got[i] == e[i]]
return [ e[0] for i in .0 if got[i] == e[i] ]
------
IndexError: list index out of range
exec example:
Traceback (most recent call last):
File "tb-exec.py", line 11, in <module> at offset 39
exec(s)
exec(s)
-------
File "<string>", line 4, in <module> at offset 18
z = x / y
-
ZeroDivisionError: division by zero
Isolating function in call stack example:
File "call-fib.py", line 8, in fib at offset 58
return fib(n-1) + fib(n-2)
return fib(n - 1) + fib(n - 2)
----------
File "call-fib.py", line 10, in <module> at offset 54
print("fib({})={}".format(2, fib(2)))
------
This modules extends the Python 3.6 API traceback module by adding in fragment decomplation info for more precise location information.
Although the API is from Python 3.6, the code runs on 3.3 or greater. Back-porting to ther Python versions is left as an exercise to the reader.
See these slides for information on the technology behind this.