python 3中exec函数的奇怪行为
为什么这个代码不起作用python 3中exec函数的奇怪行为,python,Python,为什么这个代码不起作用 class wrapper(dict): pass script = """ def foo(): print(10) foo() """ exec(script, wrapper()) 当我运行它时,我收到了以下消息: File "test.py", line 29, in <module> exec(script, wrapper()) File "<string>", line 5, in <module>
class wrapper(dict):
pass
script = """
def foo():
print(10)
foo()
"""
exec(script, wrapper())
当我运行它时,我收到了以下消息:
File "test.py", line 29, in <module>
exec(script, wrapper())
File "<string>", line 5, in <module>
File "<string>", line 3, in foo
KeyError: 'print'
那么一切都好了
我不明白,为什么字典的完全透明继承会改变脚本行为?请使用python 3.7------您的代码对我来说是正确的这只是对您的问题的一个结论-感谢其他用户的评论 使用最新的python版本将使您的代码正常工作 例如,我将最新的3.8.x与PyCharm一起使用,并使其运行正常
如果我使用exec(脚本,wrapper())执行您的原始代码,我将获得正确的输出。您使用的是什么版本的python?我在Python3.4.3FWIW中运行它,它说,“如果只提供了
globals
,那么它必须是一个字典……如果提供了,locals
可以是任何映射对象。”当我在Python3.4.3上运行它时,我会打印出10
,然后紧接着是KeyError。事实上,您的测试代码有十行,但输出抱怨第29行,这意味着您没有发布导致问题的代码。这意味着问题存在于您未发布的代码中的可能性要高于平均水平,因为没有人能够用给定的代码重现问题。
exec(script, {})