ast
모듈 의 도움으로 코드 구조를 파싱하고 수정하는 것이 가능 하며 잠시 후에 예제로 보여 드리겠습니다. 그러나 ast
모듈만으로는 수정 된 소스 코드를 다시 작성할 수 없습니다 . 이 작업에 사용할 수있는 다른 모듈이 있습니다 (예 : 여기) .
참고 : 예 아래의 사용에 입문 튜토리얼로 취급 할 수 있습니다 ast
모듈 있지만 사용에 대한보다 포괄적 인 가이드 ast
모듈은 여기에서 확인할 수있다 그린 트리 튜토리얼 뱀 과 에 공식 문서 ast
모듈 .
소개 ast
:
>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> exec(compile(tree, filename="<ast>", mode="exec"))
Hello Python!!
API를 호출하여 Python 코드 (문자열로 표시)를 구문 분석 할 수 있습니다 ast.parse()
. AST (Abstract Syntax Tree) 구조로 핸들을 리턴합니다. 흥미롭게도이 구조를 컴파일하고 위와 같이 실행할 수 있습니다.
또 다른 유용한 API는 ast.dump()
전체 AST를 문자열 형식으로 덤프하는 것입니다. 트리 구조를 검사하는 데 사용할 수 있으며 디버깅에 매우 유용합니다. 예를 들어
파이썬 2.7에서 :
>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> ast.dump(tree)
"Module(body=[Print(dest=None, values=[Str(s='Hello Python!!')], nl=True)])"
파이썬 3.5에서 :
>>> import ast
>>> tree = ast.parse("print ('Hello Python!!')")
>>> ast.dump(tree)
"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hello Python!!')], keywords=[]))])"
Python 2.7과 Python 3.5의 print 문의 구문과 각 트리의 AST 노드 유형의 차이점에 유의하십시오.
다음을 사용하여 코드를 수정하는 방법 ast
:
이제 ast
모듈 별로 파이썬 코드를 수정하는 예를 살펴 보겠습니다 . AST 구조를 수정하는 주요 도구는 ast.NodeTransformer
클래스입니다. AST를 수정해야 할 때마다 AST를 서브 클래 싱하고 이에 따라 노드 변환을 작성해야합니다.
이 예에서는 Python 2, print 문을 Python 3 함수 호출로 변환하는 간단한 유틸리티를 작성해 보겠습니다.
Fun call converter 유틸리티에 대한 명령문 인쇄 : print2to3.py :
#!/usr/bin/env python
'''
This utility converts the python (2.7) statements to Python 3 alike function calls before running the code.
USAGE:
python print2to3.py <filename>
'''
import ast
import sys
class P2to3(ast.NodeTransformer):
def visit_Print(self, node):
new_node = ast.Expr(value=ast.Call(func=ast.Name(id='print', ctx=ast.Load()),
args=node.values,
keywords=[], starargs=None, kwargs=None))
ast.copy_location(new_node, node)
return new_node
def main(filename=None):
if not filename:
return
with open(filename, 'r') as fp:
data = fp.readlines()
data = ''.join(data)
tree = ast.parse(data)
print "Converting python 2 print statements to Python 3 function calls"
print "-" * 35
P2to3().visit(tree)
ast.fix_missing_locations(tree)
# print ast.dump(tree)
exec(compile(tree, filename="p23", mode="exec"))
if __name__ == '__main__':
if len(sys.argv) <=1:
print ("\nUSAGE:\n\t print2to3.py <filename>")
sys.exit(1)
else:
main(sys.argv[1])
이 유틸리티는 아래 예제와 같은 작은 예제 파일에서 시도 할 수 있으며 제대로 작동합니다.
테스트 입력 파일 : py2.py
class A(object):
def __init__(self):
pass
def good():
print "I am good"
main = good
if __name__ == '__main__':
print "I am in main"
main()
위의 변환은 ast
튜토리얼 목적으로 만 사용 되며 실제 시나리오에서는와 같은 다른 모든 시나리오를 살펴 봐야 print " x is %s" % ("Hello Python")
합니다.