Python AST节点不能在函数内部执行
Python AST node can not be executed inside a function
任何人都可以给我关于这种行为的建议吗?下一个代码 运行 没问题:
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
时你仍然绑定到一个范围。
所以 运行 方法外的 AST 代码将 nsd
定义为全局方法,而 运行 foo()
内的 AST 代码将 nsd
foo
的直接范围的成员,因此调用将在查找方法时失败。
您可以先将 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()
任何人都可以给我关于这种行为的建议吗?下一个代码 运行 没问题:
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
时你仍然绑定到一个范围。
所以 运行 方法外的 AST 代码将 nsd
定义为全局方法,而 运行 foo()
内的 AST 代码将 nsd
foo
的直接范围的成员,因此调用将在查找方法时失败。
您可以先将 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()