사전의 문자열 표현을 취하고 사전의 항목을 나타내는 튜플 목록을 출력하는 Python 스크립트를 만들고 싶습니다. 문질러서, 정의되지 않은 변수를 가져 오길 원합니다.정의되지 않은 변수에 eval() 사용하기
입력 : {'test': test}
출력 : 내가 사전에 읽고 아직 정의되지 않은 변수를 정의하는 몇 가지 코드를 생성 한 [('test': test)]
하지만 때 내가 예는이 최고 보여 eval()
결과 변수 이름 대신 실제 변수 값으로 대체됩니다. 그것은 완벽하게 입력 문자열과 일치하는 것입니다 인쇄하지만, DICT 대신이 0의 값에 대입 것을,
import sys
import re
if __name__ == "__main__":
instr = sys.argv[1]
success = False
while not success:
try:
indict = eval(instr)
success = True
except NameError, e:
defname = re.search("name '([^\']*)' is not defined", str(e))
locals()[defname.group(1)] = 0
print indict
나는 위에서 정의 된 입력 값에 대해 기대했다 : 여기
코드입니다test
입니다. 내가
ast.literal_eval
을 시도
{'test': 0}
하지만이 정의되어있어 경우에도 문자 그대로의 모든 변수 이름에 대한 ValueError: malformed string
가 발생합니다 : 따라서 스크립트를 출력합니다.
따라서 제 질문은 : 변수 이름을 잃지 않고 입력 사전을 변환하는 방법이 있습니까?
'ast.walk'의 정의 (내 자신의 실험)에 따르면, 노드는 특별한 순서없이 되돌려 져서, 입력 문자열의 신뢰할 수있는 표현을 출력 할 수 없습니다. –
'ast.walk'는 당신이 원하는 것이 아닙니다. 트리의 각 노드를 방문해야합니다. 예제는 http://stackoverflow.com/questions/1515357/simple-example-of-how-to-use-ast-nodevisitor를 참조하십시오. –