如何在 python 中动态创建函数?

How do I dynamically make a function in python?

我在 python 中有一个计算机生成的 AST。我解释了这个 AST 2000 次,但这很慢。此外,此 AST 在运行时会发生变化,并且在编译时之前是未知的。我可以将我的 AST 代码生成为有效的 python 字符串,但我不知道如何执行它。为了给出一个概念性的概述,这就是我现在所拥有的:

def exec(AST):
   {local variables}
   {interpret AST over local variables 2000 times}

我愿意:

def exec(AST):
  {local variables}
  new_fn = make_lambda(to_python_string(AST))
  {iterate new_fn over local variables 2000 times}

注意:对 exec 的不同调用将具有在运行时构建的全新未知 AST。 我目前的瓶颈在 AST 解释上,我希望动态函数生成会使其更快。

这个有效:

def fun1():
    return 5


def fun2():
    return 7


def make_lambda(x):
    if x == 1:
        return fun1
    else:
        return fun2

print(make_lambda(1)())
print(make_lambda(2)())

所以 python3.8 确实有一个 exec 命令接受一个字符串并执行它。如果您生成的函数调用局部变量,则有一些注意事项。

这个有效:

def exec(AST):
  {local variables}
  exec("def new_fn():\n" + to_python_string(AST), globals())
  {iterate new_fn over local variables 2000 times}

这比解释 AST 快得多。