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.
왜? 이것은 문제 자체보다는 원하는 솔루션을 설명하는 경우와 같습니다. 추측을 위험에 빠뜨리면 다음에 코드가 실행될 때 객체의 상태를 유지하려고합니다. JSON 형식으로 객체를 직렬화하고 파일에 저장하는 것은 완벽한 상황입니다! 그런 다음 코드가 다시 실행되면 파일에서 역 직렬화합니다. – Aaron3468
음, 아마도. 문제 - 템플릿 모델, 양식, 템플릿, 뷰, URL을 생성하여 개발 장고 페이지를 간단하게 만들고 싶습니다. 그리고 문제는 장고 URL을 수정하는 것입니다. 그것은 목록입니다. 그래서 파일의 끝에 쓸 수는 없습니다. – Vladimir
'pickle', JSON 등 –