0

我有一些这样的代码:

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,但f1myscope. 如果 Python 以某种方式允许内联,并且我内联了 的代码mylib.codegen,那么一切都会好起来的,但我认为 Python 不允许内联代码。如何设置以便在调用者函数的命名空间中执行生成的代码对象?

4

1 回答 1

0

fn.func_globals包含给定函数的全局命名空间;您需要它能够执行转换和重新编译的代码对象:

myscope = {}
myscope.update(fn.func_globals)

不要fn.func_globals直接使用;您不想覆盖该命名空间中的项目。

于 2012-12-13T07:16:06.683 回答