-
python source code 에서 AST(추상구문트리) 추출카테고리 없음 2022. 7. 27. 22:27
어디서 문제가 생겼나?
python 소스 코드에서 ast 를 추출하는 py 코드를 깃허브에서 보면서 이해가 잘 가지 않았다.
그래서 ast 모듈에 대해 공부해보았다. 이 과정을 통해, 내가 ast 추출로 작성할때, 파이썬 코드를 어떤 형태로 입력에 넣어주어야 하는지
방법을 찾았다.
무엇을 배웠나?
ast 모듈에 내장되어 있는 ast.parse(string text) 를 통해 원하는 구문을 ast 객체 형태로 바꿀 수 있다.
이것이 어떤 형태인지 직접 출력하여 확인하고 싶다면. ast.dump(ast.parse(text)) 형태로 표현하면 된다.
source code에는, 변수 선언, 함수 선언부터, 대입(=), 연산(+,-, / ), 비교, 클래스 선언, 상속 등 많은 구성요소들로 이루어져 있다.
따라서 ast 는 이러한 형태를 포착하기 위해 각각의 구성요소들을 모두 등록해놓았고.
https://docs.python.org/3/library/ast.html#function-and-class-definitions
위의 공식 python docs 에는 모든 구성요소들이 적혀져 있다. 여기에 나와 있는 구성요소들에 맞춰, 우리가 입력으로 넣은 텍스트가 일치하는 항목을 찾아 "이것은 클래스구나, 이것은 함수구나, 이것은 대입이구나, 비교구나" 등등을 표현해준다고 이해하였다.
https://github.com/TranSMS/M2TS/blob/master/Data_pre/python_get_ast.py
위의 코드는 M2TS 머신러닝 모델을 만든 팀에서 작성하고 배포한 python ast 추출 소스코드이다.
이 소스코드를 만약에 그대로 사용하고 싶다면(나도 한입에 덜컥 먹으려다가.. 계속 왜안되지 하고 스스로를 자책했기 때문에)
ast 추출을 원하는 코드를, 에디터 한줄에 모두 붙여넣고, 이 과정에서, 줄 띄어쓰기는 '\n' 으로, indent는 '\t' 로 표현해주어야 실행된다.
다음의 예시처럼 말이다 :: x=3\nx+=2
'' 는 붙이지 않아도 된다.
또한, def 가 지금 제대로 인식되지 않는 것 같은데 방법을 찾아보고 있다(22.07.27)
ㄴ> 해결되었다.
내가 혼자 삽질헀던 상황은 def main(): 만 넣고, 왜 이것을 못 잡는지 궁금해한 것인데, 아래의 링크를 참고해보니.
def 를 ast.parse 가 캐치하려면, def 의 전체 라인을 넣어주어야 한다.
reference: