2015-01-12 17 views
1

我試圖做到這一點:在Python3.3中發生了什麼與exec?

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

logic包含類邏輯的代碼。

的錯誤是

NameError: global name 'Logic' is not defined 
+1

@BhargavRao:實際上,這個職位不解釋這裏發生了什麼接近。請參閱[Python 2和Python 3中的exec函數的行爲](http://stackoverflow.com/q/15086040)。 –

+0

@MartijnPieters是的,其他更好。謝謝 –

回答

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