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')
我正在尝试这样做:
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')