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, {})