[Python-Dev] Can I introspect/reflect to get arguments exec()?
Benjamin Peterson
benjamin at python.org
Wed Mar 27 03:18:11 CET 2013
2013/3/26 Rocky Bernstein <rocky at 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
More information about the Python-Dev
mailing list