2009-05-25 3 views
1

이번 주말 나는 시그니처 보존 데코레이터를 만드는 Michele Simionato의 decorator module 조각으로 찢어 버렸습니다. 모두의 마음에 나는이 코드로 장난, 발견사전 컴파일 여부와 상관없이 exec 문

src = """def function(a,b,c) :\n return _caller_(a,b,c)\n""" 
evaldict = {'_caller_' : _caller_} 
code = compile(src, '<string>', 'single') 
exec code in evaldict 
new_func = evaldict[function] 

이 비슷한을 작동하는 동적으로 생성 기능은 ... 컴파일 단계는 완전히 피할 갈 수 있다는,이 하나 :

exec src in evaldict 

지금, 나는 그 추가 단계에 대한 좋은 이유가 확실 해요,하지만 두 방법의 차이점이 무엇인지 찾을 수가있다. 공연?

내가 묻는 바로는 새로운 기능을 정의하고 그에 대한 핸들을 얻을 수있는 유사한 기능을 eval에서 얻을 수 있습니까? 나는 시도했지만, 일할 수 없었다. ...

답변

2

내가보기에 약간의 차이가있다. 첫째, compile은 구문 오류가 발생했을 때 exec보다 약간 더 나은 구문을 사용합니다. 나는 진짜 이유가 compile의 정의가 exec이 조금 덜 정확하다는 새로운 줄 문자 처리와 관련하여 매우 명백하다고 의심합니다.

왜 내부 기능 대신에 compileexec이 사용되고 있는지 궁금했습니다. compile/exec을 사용하면 사용 가능한 전역을 제어 할 수 있습니다. 매우 흥미로운.

+0

성능은 어떻습니까? 어떤 이유로 컴파일 속도가 더 빨라지는 것 같습니까? – Radu

+0

나는 정말로 모른다. 같은 소스에서'exec'를 여러 번 호출하면'compile '이 빠를 것이라고 생각합니다. 문자열로 호출 된'exec'는 문자열을 바이트 코드로 컴파일 한 다음 실행합니다. 컴파일은 각 호출에서 발생합니다. –

2

compile()을 사용하면 생성 된 코드 객체와 해당 이름과 소스를 제어 할 수 있지만 exec는 유연성이 떨어집니다. 다른 사람들이 코드를 읽을 때 별도의 단계임을 배워두고 나중에 같은 코드를 한 번 이상 exec 할 필요가있을 때 (compile()을 한 번 실행하면 여러 번 exec 할 수 있습니다) 더 빨리), 그것을 읽는 다음 사람을 교육하기위한 코드를 작성하면 디자인 선택에 항상 영향을 미칩니다.

관련 문제