2017-11-16 16 views
0

단일 함수 파이썬 할당의 경량 자동 등급 지정을위한 프레임 워크와 같은 단위 테스트를 작성해야합니다. 나는 다음과 같은 것을하고 싶다 :함수 객체에 파이썬 소스 코드로드

test = """ 
def foo(x): 
    return x * x 
""" 

compiled_module = magic_compile(test) 
result = compiled_module.foo(3) 
assert result == 9 

그런 magic_compile 기능이 있습니까? 지금까지 내가 가진 최선책은

exec(test) 
result = getattr(sys.modules[__name__], 'foo')(3) 

그러나 이것은 위험하고 불안정한 것 같습니다. 프로덕션 환경에서는 실행되지 않으므로 샌드 박스 및 안전에 대한 걱정은 없습니다. 그냥 내가 놓친 더 나은 해결책이 없는지 확인하고 싶었습니다. 파이썬 3.x의에서

+0

임의의 기능을 실행하는 것은 임의의 코드를'exec '하는 것보다 덜 위험하지 않습니다. 두 경우 모두 악의적 인 행동에 대해 동일한 예방 조치를 취해야합니다. – nneonneo

+0

그래, 나는이 답변에서와 같이 파이썬을 샌드 박스하는 쉬운 방법이 없다고 생각한다. (https://stackoverflow.com/a/3068475/816458). 내 큰 관심사는 내가 호출 할 수있는 객체에로드하는 방법입니다. – thomas88wp

답변

1

:

module = {} 
exec(test, module) 
assert module['foo'](3) == 9 

module는 모듈의 네임 스페이스를 오염 피하기 위해 코드의 전역을 보유 할 단지 네임 스페이스의 실제 파이썬 모듈이 아니다.