2012-12-14 2 views
1

eval을 사용하여 파일에서 객체를로드하려고합니다. 유효한 파이썬 표현식이되도록 그 객체는 파일에 덤프 - 모든 유형이 자신의 FQDN과 함께 제공됩니다, 같은 : 나는 eval에이 공급되면자동으로 필요한 모듈을 eval (...)로 가져옵니다.

mod1.Class1(
    attr1=mod2.Class2(a=1,b=2), 
    attr2=[1,2,3,4], 
    attr3=mod1.submod1.Class3(), 
) 

는, 그 모든 모듈이 수입되어 있지 범위가 eval인데 최상위 모듈의 경우 NameError: name 'mod1' is not defined이거나 가져올 때 서브 모듈의 경우 AttributeError: 'module' object has not attribute 'submod1'입니다.

어떻게 처리 할 수 ​​있습니까? 나는 NameError을 구문 분석 __import__을 실행하고 eval을-하려고 다시,하지만 난 AttributeError에서 무엇이 잘못되었는지 얻는 방법을 딱하다 수 있습니다.

나는 compile의 표현이 필요하다 무엇이든 AST 및 가져 오기를 걸어 공급 수 있을까요? 어쨌든 대서양과 함께 일한 적이 없습니까?

참고 여기 보안에 대한 하지 관심이 있습니다.

답변

1

왜 이것에 대한 pickle을 사용할 수 있습니까? 심지어 직렬화 및 인스턴스화 측면을 제어하기 위해 클래스에 __getstate____setstate__ 메소드를 사용할 수도 있습니다. 자신의 eval() 것을하는 것보다 진지하게 좋아 보인다.

그렇지 않으면 직렬화 형식의 값은 어떻게 제어? 나는. 어쩌면 모듈이 필요한지 예측할 수 있습니다. 데이터에 대한

+0

데이터를 사람이 읽을 수 있고 손쉽게 수정할 수 있어야합니다. 그래서 절임이 끝났어. 값은 너무 많이 제어되지 않으며 주 패키지에는 여러 수준에서 너무 많은 하위 모듈이 있습니다. – eudoxos

1

당신이 전체 파이썬을 사용하여 법적인하는 경우 (오히려 뭔가보다 더 쉽게 JSON이나 YAML과 같은 구문 분석)는 AST를 걷는 꽤 가능한 소리. ast.NodeVisitor을 구현하고 방문한 속성 노드를 추적하고 싶을 것입니다.

관련 문제