考虑以下脚本,它用于exec
定义两个函数,其中一个调用另一个:
def run_code():
code = """
def foo():
print('foo')
return 1
def bar():
print('bar calls foo')
return 1 + foo()
result = bar()
"""
exec(code, globals(), locals())
print('Result: {}'.format(locals()['result']))
run_code()
我希望看到以下输出:
bar calls foo
foo
Result: 2
但相反,我得到以下输出+堆栈跟踪:
bar calls foo
Traceback (most recent call last):
File "minimal.py", line 17, in <module>
run_code()
File "minimal.py", line 14, in run_code
exec(code, globals(), locals())
File "<string>", line 10, in <module>
File "<string>", line 8, in bar
NameError: name 'foo' is not defined
有趣的是,如果将 的内容run_code
移到模块级别,则可以正常工作。但是,如果我随后替换globals()
或locals()
使用新的空字典,它会再次中断。我也知道放入def foo
' bar
s body 会使其工作。
为什么会发生此错误,正确的解决方法是什么?
(我知道这exec
通常是不受欢迎的。我使用它是有充分理由的。)