我试图这样做:
def Play(self, logic, board, id):
exec(logic)
l = Logic()
return l.Play(id, board)
logic
包含Logic类的代码。
错误是
NameError: global name 'Logic' is not defined
答案 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')