在Python.3中exec发生了什么?

时间:2015-01-12 14:05:32

标签: python exec

我试图这样做:

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

logic包含Logic类的代码。

错误是

NameError: global name 'Logic' is not defined

1 个答案:

答案 0 :(得分:3)

因为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')