2015-01-12 1 views
1

나는이 작업을 수행하기 위해 노력하고있어 :Python3.3에서 exec와 무슨 문제가 있습니까?

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

logic는 클래스 논리의 코드가 포함되어 있습니다. exec() 이제 함수이기 때문에

오류가

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

@BhargavRao : 사실, 그 후 여기에 무슨 설명에 가까이 오지 않습니다. 대신에 [Python 2 및 Python 3의 exec 함수 동작] (http://stackoverflow.com/q/15086040)을 참조하십시오. –

+0

@MartijnPieters 네, 다른 쪽이 좋습니다. 감사 –

답변

3

, 당신은 더 이상 파이썬 기능에 지역 이름을 설정하는 데 사용할 수 있습니다.

파이썬 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')