2014-09-16 5 views
1

내가 파일 example.py 있다고 가정 수입 예를파이썬에서 변수의 ast.literal_eval은 무엇입니까?

VVV = 2 

DictionaryNameB = { 
    'a'     : VVV, 
    'bb'     : 'SomethingB', 
    'c'     : False, 
    'ccc'     : None, 
    'dddd'    : 'true', 
    'eeeee'    : 0.123456, 
    'f'     : 2, 
    'h'     : [1,2,3] 
} 

내가 ast.literal_eval() 사용하는 기능 썼다 :

def getDicFromFile(self, dic_name): 
    with open('example.py') as f: 
     file_data = f.read() 
    match = re.findall('%s[^{]+\{[^\}]+\}' % dic_name, file_data, re.MULTILINE)[0] 
    # print(match) 
    dicObject = ast.literal_eval(match[len(dic_name)+3:]) 
    return dicObject 

을 내가 가지고 오류가 ValueError를 ('조작 된 문자열')을 제기; ValueError : 형식이 잘못된 문자열

ast.literal_eval()은 변수 VVV을 디코딩 할 수 없다는 것을 알고 있습니다. 다른 방법이 있습니까?

+0

['eval'] (https://docs.python.org/2/library/functions.html#eval) –

+3

파일을 * 가져 오기 *하십시오. – poke

+1

@ behzad.nouri :'eval()'은 표현식이 아닌 표현식만을 지원합니다. 과제는 성명서이므로 효과가 없습니다. –

답변

4

제한된 문을 실행하기 위해 ast 구문 분석 트리를 빌드하는 라이브러리 인 asteval을 사용할 수 있습니다. 그냥 파일을 가져올 수

from asteval import Interpreter 

aeval = Interpreter() 
aeval(file_data) 
dicObject = aeval.symtable['DictionaryNameB'] 

을 또는 : 그것은 상자에서 당신의 예를 처리 할 수 ​​있습니다

from importlib import import_module 
module = import_module('example') 
dicObject = module.DictionaryNameB 

asteval

파이썬이 구축 꽤 넓은 번호를 수 있습니다. Python Abstract Grammaraeval.node_handlers 매핑 레지스터가 어떤 핸들러인지 비교하고 필요없는 것을 삭제하면됩니다. 함수 정의와 호출, 반복, 2 진 연산 ( binop) 및 예외 처리를 제거 할 수 있습니다.

+0

파일을 가져 오는 것이 무엇을 의미합니까? – omertalmi

+0

@omertalmi :'import example'은 파일을 파이썬 모듈로로드합니다. –

+0

asteval은 알려진 공격 벡터로부터 보호합니다. * 리소스 호깅을 제외한 * 9 ** 9 ** 9는 여전히 모든 시간 및/또는 메모리를 소모합니다. –

관련 문제