[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