2017-04-23 1 views
0

수정 된 파이썬 객체를 다시 소스로 덤프해야합니다.파이썬 객체를 파이썬 AST 노드로 변환

import ast 
import importlib 

import astor 


m = importlib.import_module('something') 

# modify an object 
m.VAR.append(123) 

ast_nodes = some_magic(m) 

source = astor.dump(ast_nodes) 

제발 도와주세요 : 그래서 내가 원하는 사용의

예, 파이썬 2 (소스를 덤프 astor lib에 나중에 사용하기 위해) 파이썬 ast.Node에 실제 파이썬 개체를 변환하기 위해 뭔가를 찾으려고 그것을 찾으려면 some_magic

+1

왜? 이것은 문제 자체보다는 원하는 솔루션을 설명하는 경우와 같습니다. 추측을 위험에 빠뜨리면 다음에 코드가 실행될 때 객체의 상태를 유지하려고합니다. JSON 형식으로 객체를 직렬화하고 파일에 저장하는 것은 완벽한 상황입니다! 그런 다음 코드가 다시 실행되면 파일에서 역 직렬화합니다. – Aaron3468

+0

음, 아마도. 문제 - 템플릿 모델, 양식, 템플릿, 뷰, URL을 생성하여 개발 장고 페이지를 간단하게 만들고 싶습니다. 그리고 문제는 장고 URL을 수정하는 것입니다. 그것은 목록입니다. 그래서 파일의 끝에 쓸 수는 없습니다. – Vladimir

+0

'pickle', JSON 등 –

답변

1

AST가 작동하지 않기 때문에 원하는 것을 할 방법이 없습니다. 인터프리터가 코드를 실행하면 소스 파일에서 AST가 생성되고 으로 해석하여 파이썬 객체를 생성합니다. 생성 된 객체에 발생하는 일은 AST와 아무 관련이 없습니다.

그러나 처음에는 객체를 생성 한 대상의 AST를 가져올 수 있습니다.

import ast 
import importlib 
import inspect 

m = importlib.import_module('pprint') 
s = inspect.getsource(m) 
a = ast.parse(s) 
print(ast.dump(a)) 
# Prints the AST of the pprint module 

그러나 getsource()가 적절 이름 : 모듈 inspect은 당신이 어떤 파이썬 객체의 소스 코드를 얻을 수 있습니다. m에서 일부 변수 (또는 다른 객체)의 값을 변경하면 소스 코드가 변경되지 않습니다.

객체에서 AST를 재생성 할 수 있다고하더라도 some_magic()이 반환 할 수있는 유일한 해결책은 없습니다. 잘 (

# In some_module.py 
x = 0 

# In __main__.py 
m = importlib.import_module('some_module') 
m.x = 1 + 227 

이제 m.x의 값이 228이지만, 그 값을 주도 표현의 종류를 알 수있는 방법은 없습니다 : 내가 다른 모듈에 재 할당 할 것을, 나는 어떤 모듈의 변수 x이 상상 , __main__.py의 대서양 표준시를 읽지 않고도 이것은 빨리 빠져 나올 것입니다.) 그것은 단순한 문자인가? 함수 호출의 결과?

모듈의 일부 값을 수정 한 후에 실제로 새 AST를 얻어야하는 경우 가장 좋은 해결책은 원래 AST를 혼자 변환하는 것입니다. 식별자에 값이있는 위치를 찾고 할당 값을 원하는 값으로 바꿀 수 있습니다. 예를 들어 , 내 작은 예에 x = 0 다음 AST에 의해 표현된다 :

Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=0)) 

내가 __main__.py에서했던 재 할당 일치하는 AST를 얻기 위해, 나는 같은 위 Assign 노드의 값을 변경해야 할 것입니다 다음 : 당신이 그 길을 갈하려는 경우

value=BinOp(left=Num(n=1), op=Add(), right=Num(n=227)) 

, 당신이 파이썬 년대 AST 노드 변압기 (ast.NodeTransformer)의 문서뿐만 아니라, 파이썬에서 만날 수있는 모든 노드를 문서화이 우수한 설명서를 확인하는 것이 좋습니다 대서양 표준시 Green Tree Snakes - the missing Python AST docs.