Augument Python 3 정적 유형 정보가 포함 된 AST (Abstract Syntax Trees).
Python은 동적으로 입력 한 프로그래밍 언어입니다. 그러나 일반적으로 보이는 Python 코드의 대부분은 정적으로 입력 한 경우에도 작동합니다!
이 패키지를 사용하면 정적 유형 정보를 Python Abstract 구문 트리 (ASTS)에 삽입 할 수 있으므로 Python이 정적으로 입력 한 경우 주어진 코드가 작동한다고 가정하면 실행에 앞서 코드의 유형에 대해 추론 할 수 있습니다.
이러한 증강 된 AST는 주로 다른 도구를 사용하여 분석/소비를위한 것입니다.
typed_ast 모듈의 AST와 가장 잘 작동하지만 내장 ast 모듈에서도 작동합니다.
이것은 진행중인 작업이며 현재의 구현은 갑작스런 변화의 대상이됩니다.
Python 3.8이 릴리스 된 후 typed_ast 의 지원이 삭제됩니다. 기능은 내장 된 AST 파서로 병합됩니다.
내용물
static_typing 모듈을 사용하여 parse() 함수를 사용하여 직접 코드를 구문 분석 할 수 있습니다.
import static_typing as st
class MyClass :
pass
module = st . parse ( 'def my_fun(obj: MyClass) -> MyClass: return obj' )
# TODO: currently there is no public API yet
functions = module . _functions
my_fun = module . _functions [ 'my_fun' ]
assert MyClass in my_fun . _params [ 'obj' ] 또는 augment() 함수를 사용하여 기존 AST를 보강 할 수 있습니다.
import static_typing as st
import typed_ast . ast3
module = typed_ast . ast3 . parse ( '''def spam(): x, y, z = 'ham', 42, 3.1415 # type: str, int, float''' )
module = st . augment ( module )
# TODO: currently there is no public API yet
function = module . _functions [ 'spam' ]
assert len ( function . _local_vars ) == 3
assert float in function . _local_vars [ 'z' ]더 많은 예는 예제를 참조하십시오 .ipynb 노트북.
주요 기능에 추가로 라이브러리에는 static_typing.ast_manipulation 모듈이 포함되어 있으며 저수준 도구 및 빌딩 블록이 포함되어 있습니다.
typed_ast 에서 내장 ast 및 그 반대의 경우) 및 augment() 함수가 구현하는 프로세스 또는 정적 타이핑에는 3 가지 주요 단계가 있습니다.
모든 해당 노드에서 유형 힌트는 fields type_comment , annotation 및 returns 에 저장됩니다. 유형 힌트 리졸버는 해당 필드를 읽습니다.
제공된 Python 기호 테이블을 사용하여 내성을 사용하여 유형 힌트를 실제 유형 객체로 해결합니다.
기본적으로 Resolver는 직접 호출되거나 augment() 통해 내장 된 기호 만 사용합니다. 그러나 parse() 통해 호출되면 기본적으로 발신자의 globals() 및 locals() 사용합니다.
해결 된 유형 힌트는 AST에 직접 저장됩니다. 구체적으로, 각각의 해결 된 필드는 해당 명명 된 필드에 저장되며,이 필드는 resolved_type_comment , resolved_annotation 또는 resolved_returns 입니다.
따라서 정적 유형 정보는 AST에서 사용할 수있게됩니다.
이름 선언이 포함될 수있는 각 AST 노드에 대해 노드의 발진 버전이 제공됩니다. 각 확장 된 AST 노드에는 각 이름과 관련된 선언 된 이름 및 유형 정보를 저장하는 새 필드가 있습니다.
이 새로운 필드는 로컬 범위 내의 모든 해결 된 유형 힌트의 모든 유형 정보를 저장하므로 유형 충돌 또는 유형 정보 부족을 감지 할 수 있습니다. 또한이 결합 된 정보를 기반으로, 유형 추론을 수행 할 수 있습니다.
구체적으로, 새로운 필드가있는 AST 노드의 새로운 버전이 제공됩니다 : Module , FunctionDef , ClassDef , Assign , AnnAssign For With 이 새로운 버전에는 이름이 StaticallyTyped...
새로운 분야에서 정보가 수집되는 엔티티 목록이 따릅니다.
Module 용 :
FunctionDef :
ClassDef 의 경우 :
Assign 및 AnnAssign :
For :
With :
AST 재 작성은 위에 나열된 일반 AST 노드를 확장 버전으로 바꾸는 것을 의미합니다.
파이썬 버전 3.5 이상.
요구 사항에 지정된 파이썬 라이브러리.
테스트를 구축 및 실행하려면 추가로 Test_Requirements.txt에 나열된 패키지가 필요합니다.
Linux 및 Windows에서 테스트되었습니다.