我有一些这样的代码:
def f1():
<some stuff here>
.
.
.
@mylib.codegen
def f2(args):
f1()
<some more stuff here>
mylib.py :
def codegen(fn):
src = inspect.getsource(fn)
original_ast = ast.parse(src)
new_ast = transform_ast(original_ast)
code_obj = compile(new_ast, '<auto-generated>', 'exec')
myscope = {}
exec code_obj in myscope
fn.generated_fn = myscope['name'] # Where name is the binding created by execing code_obj
总而言之,mylib.codegen
是一个装饰器,它解析 f 的代码,基于 ast of 创建另一个函数的 ast f
,执行生成函数的代码以获取可调用函数并将可调用函数设置为 的属性f
。这意味着当f2
第一次导入时,f2
动态获取另一个函数作为其自身的属性。
生成的函数也需要调用f1
,但f1
在myscope
. 如果 Python 以某种方式允许内联,并且我内联了 的代码mylib.codegen
,那么一切都会好起来的,但我认为 Python 不允许内联代码。如何设置以便在调用者函数的命名空间中执行生成的代码对象?