2013/3/26 Rocky Bernstein <ro...@gnu.org>: > [asked on comp.lang.python but no takers. So I'm bumping it up a notch.] > > I have ported my Python debugger pydbgr to Python3. See [1] or [2]. > > Inside the debugger, when there is an exec() somewhere in the call stack, > I'd like to be able to retrieve the string parameter. With this, the > debugger can show part of the string in a call stack. Or it can show the > text when the frame is set to that exec() frame. > > Going further, the debugger could write the exec string out to a temporary > file. And when reporting locations, it could report not just something like > "<string> line 4", but also give that temporary file name which a front-end > could use as well. > > So consider this code using inspect.getargvalues() and > inspect.currentframe(): > > import inspect > def my_exec(string): > show_args(inspect.currentframe()) # simulate exec(string) > > def show_args(frame): > print(inspect.getargvalues(frame)) > > my_exec("show_args(inspect.currentframe())") > exec("show_args(inspect.currentframe())") > > > When run this is the output: > > python3 exec-args.py > ArgInfo(args=['string'], varargs=None, keywords=None, locals={'string': > 'show_args(inspect.currentframe())'}) > ArgInfo(args=[], varargs=None, keywords=None, locals={'my_exec': > <function my_exec at 0xb6f828ec>,, ... > > > In a different setting, CPython byte-code assembly that gets generated for > running exec() is: > > 25 88 LOAD_GLOBAL 10 (exec) > 91 LOAD_CONST 4 > ('show_args(inspect.currentframe())') > --> 94 CALL_FUNCTION 1 > 97 POP_TOP > > What's going on?
execing something is not the same as calling it, so there are no arguments. -- Regards, Benjamin _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com