Python3.3 中的 exec 发生了什么?

What happend with exec in Python3.3?

我正在尝试这样做:

def Play(self, logic, board, id):
    exec(logic)
    l = Logic()
    return l.Play(id, board)

logic 包含 class 逻辑的代码。

错误是

NameError: global name 'Logic' is not defined

因为 exec() 现在是一个函数,您不能再使用它在 Python 函数中设置局部名称。

在 Python 2 中,其中 exec 是一个语句,编译器可以检测它的使用并禁用函数的正常本地名称优化。

将您的代码执行到新字典中:

namespace = {}
exec(logic, namespace)
l = namespace['Logic']()

演示:

>>> logic = '''\
... class Logic:
...     def Play(self, id, board):
...         return id, board
... '''
>>> def Play(logic, board, id):
...     namespace = {}
...     exec(logic, namespace)
...     l = namespace['Logic']()
...     return l.Play(id, board)
... 
>>> Play(logic, 'foo_board', 'bar_id')
('bar_id', 'foo_board')