#line in python
Duncan Booth
duncan.booth at invalid.invalid
Mon Feb 20 06:27:06 EST 2012
Ross Boylan <ross at biostat.ucsf.edu> wrote:
> As an extension or alternate, could there be a decorator like
> @source_line(lineno, filename)
> for classes and methods that could do the conversion on the fly? I
> don't know if there's a way to go from the function (or class) object
> the decorator receives to the AST.
>
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.
If you don't have a 1:1 correspondence of lines then you'll need to pick
out all the existing line numbers from the code object co_lnotab and modify
them: see dis.py findlinestarts() for how to do this.
Classes would be harder: the decorator doesn't run until after the class
body has executed, so you can't change the line numbers that way until it's
too late. The only thing I can think would be to put all of the generated
code inside a function and fix up that function with a decorator that scans
the bytecode to find all contained classes and fix them up.
Or you could generate a .pyc file and then fix up line numbers in the whole
file: see
http://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html for
some code that shows you what's in a .pyc
--
Duncan Booth http://kupuguy.blogspot.com
More information about the Python-list
mailing list