Python AST 节点无法在函数内执行

标签 python python-2.7 abstract-syntax-tree

有人可以给我关于这种行为的建议吗?下面的代码运行良好:

import ast


node = ast.parse('def nsd(a, b):\n    if b == 0: return a    \n    return nsd(b, a%b)\n\nprint nsd(18,15)')
obj = compile(node, filename="<ast>", mode="exec")
exec obj

但是当我在函数内执行相同操作时:

import ast


def foo():
    node = ast.parse('def nsd(a, b):\n    if b == 0: return a    \n    return nsd(b, a%b)\n\nprint nsd(18,15)')
    obj = compile(node, filename="<ast>", mode="exec")
    exec obj

foo()

它会引发错误:

Traceback (most recent call last):
  File "C:/Users/Vectoun/PycharmProjects/untitled3/test.py", line 9, in <module>
    foo()
  File "C:/Users/Vectoun/PycharmProjects/untitled3/test.py", line 7, in foo
    exec obj
  File "<ast>", line 5, in <module>
  File "<ast>", line 3, in nsd
NameError: global name 'nsd' is not defined

我希望能够在函数内运行它。有谁知道如何解决这个问题吗?

最佳答案

如果我没记错的话,这里的问题是,当使用 exec 时,你仍然绑定(bind)到一个范围。

因此在方法外部运行 AST 代码会将 nsd 定义为全局方法,而在 foo() 内运行 AST 代码将使 nsdfoo 直接作用域的成员,因此调用在查找方法时将失败。

您可以通过首先将 nsd 定义为全局来修复它:

import ast


def foo():
    code = """global nsd
def nsd(a, b):
    if b == 0:
        return a
    return nsd(b, a%b)
print nsd(18,15)
    """
    node = ast.parse(code)
    obj = compile(node, filename="<ast>", mode="exec")
    exec obj

foo()

关于Python AST 节点无法在函数内执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253915/

相关文章:

javascript - CSS AST 分析器

Python:替换函数以编辑文件

python - 编程挑战中的高耗时和低效率

python - 如何修补函数的 __code__?

python - ">"无法将 python 命令的输出定向到文件

python - 将大数据帧拆分为多个较小的数据帧

parsing - 我可以使用LLVM解析Fortran吗?

python - 数组索引的开放网格

Python : Comparing two times, 并在几分钟内返回

python - 如何通过 Python 访问 Windows 屏幕键盘配件