Python在运行时从函数中提取body

use*_*310 4 python function

给定Python中的函数定义如下:

a = 3
b = 4
c = 5
def add():
    d = a+b+c
Run Code Online (Sandbox Code Playgroud)

是否有可能获得一个代码对象或类似物给我:

a = 3
b = 4
c = 5
d = a+b+c
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

函数对象有一个与之关联的代码对象; 你可以exec那个代码对象:

>>> a = 3
>>> b = 4
>>> c = 5
>>> def add():
...     d = a+b+c
... 
>>> exec add.func_code
Run Code Online (Sandbox Code Playgroud)

但是,这不会d在本地名称空间中设置,因为它被编译为仅使用操作码创建本地名称STORE_FAST.您必须转换此字节码才能使用STORE_DEREF操作码,这需要您学习AST转换.

如果您确实想要沿着这条路走下去,那么请阅读Python中的探索动态范围,它将教您Python范围和字节代码的细节.