【发布时间】:2020-10-29 04:08:02
【问题描述】:
考虑以下脚本,它使用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 的体内会起作用。
为什么会发生此错误,正确的解决方法是什么?
(我知道exec 通常不受欢迎。我使用它是有充分理由的。)
【问题讨论】:
-
修改
locals()是未定义的行为,而您正在这里这样做。 -
@user2357112supportsMonica 如果我用新的空字典替换
locals()和globals(),问题仍然存在。
标签: python python-3.x python-exec