Ross Boylan <r...@biostat.ucsf.edu> wrote: >> No [easy] way to go from bytecodes back to AST, but I see no reason >> why you can't create a new code object with your filename and line >> numbers and then create a new function using your modified code >> object. > Could you elaborate? I don't understand what you are suggesting.
This (written for Python 3.x, needs some attribute names changing for Python 2.x: import functools def source_line(lineno, filename = None): def decorator(f): c = f.__code__ code = type(c)( c.co_argcount, c.co_kwonlyargcount, c.co_nlocals, c.co_stacksize, c.co_flags, c.co_code, c.co_consts, c.co_names, c.co_varnames, c.co_filename if filename is None else filename, c.co_name, lineno, c.co_lnotab, c.co_freevars, c.co_cellvars) f.__code__ = code return f return decorator @source_line(43, 'foo.bar') def foo(): """This is foo""" for i in range(10): bar() @source_line(665, 'evil.txt') def bar(): raise RuntimeError("oops") if __name__=='__main__': import traceback try: foo() except RuntimeError as ex: traceback.print_exc() When you run it the output looks something like this (if you create a file evil.txt with 667 lines): Traceback (most recent call last): File "C:\temp\foo.py", line 30, in <module> foo() File "foo.bar", line 47, in foo File "evil.txt", line 667, in bar Evil line 667 RuntimeError: oops -- Duncan Booth http://kupuguy.blogspot.com -- http://mail.python.org/mailman/listinfo/python-list