给定 Python 中定义如下的函数:
a = 3
b = 4
c = 5
def add():
d = a+b+c
是否有可能获得一个代码对象或类似的东西给我:
a = 3
b = 4
c = 5
d = a+b+c
函数对象有一个与之关联的代码对象;您可以exec
使用该代码对象:
>>> a = 3
>>> b = 4
>>> c = 5
>>> def add():
... d = a+b+c
...
>>> exec add.func_code
然而,这不会在本地命名空间中设置,因为它被编译为仅使用操作码d
创建本地STORE_FAST
名称。您必须转换此字节码以使用STORE_DEREF
操作码,这需要您学习 AST 转换。
如果您确实想走这条路,那么请阅读在 Python 中探索动态范围,它教您 Python 范围和字节码的来龙去脉。
你可以使用global
命令,这是我认为最简单的方法
>>> a = 3
>>> b = 4
>>> c = 5
>>> def add():
global d
... d = a+b+c