考虑以下脚本,它用于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()or locals(),它会再次中断。我也知道,放进def foo体内bar就能发挥作用。
为什么会发生此错误?正确的解决方法是什么?
(我知道这exec通常会让人皱眉。我使用它是有充分理由的。)
不负相思意
元芳怎么了
相关分类