Augument Python 3静的なタイプ情報を備えた抽象的構文ツリー(AST)。
Pythonは、動的に型付けされたプログラミング言語です。ただし、通常見られるPythonコードの多くは、静的に型付けされていても機能します!
このパッケージを使用すると、静的タイプ情報をPython Abstract Syntax Tree(AST)に挿入できます。そのため、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()関数を使用して既存のasttを補強することができます。
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' ]その他の例については、例を参照してください。IpynbNotebook。
主な機能に加えて、ライブラリには、低レベルのツールとビルディングブロックを含むstatic_typing.ast_manipulationモジュールが含まれています。
typed_astから組み込みのastに、その逆)augment()機能を実装するプロセスまたは静的タイピングには、3つの主要なステップがあります。
該当するすべてのノードで、タイプヒントはフィールドtype_comment 、 annotation 、およびreturnsに保存されます。タイプのヒントリゾルバーは、これらのフィールドを読み取ります - それらは生の文字列またはASTのいずれかです。
提供されたPythonシンボルテーブルを使用して、内省を使用して実際のタイプオブジェクトへのタイプヒントを解決します。
デフォルトでは、Resolverは、直接またはaugment()を介して呼び出されたときに組み込みのシンボルのみを使用します。ただし、 parse()を介して呼び出されると、デフォルトで発信者のglobals()とlocals()を使用します。
解決されたタイプのヒントは、ASTに直接保存されます。具体的には、各解決済みフィールドは、 resolved_type_comment 、 resolved_annotation 、またはresolved_returnsのいずれかである対応する名前のフィールドに保存されます。
したがって、ASTで静的型情報が利用可能になります。
任意の名前宣言を含む可能性のある各ASTノードについて、ノードの除外バージョンが提供されます。拡張された各ASTノードには、各名前に関連付けられた宣言された名前とタイプ情報を保存する新しいフィールドがあります。
これらの新しいフィールドは、すべての解決型タイプのヒントからすべてのタイプ情報をローカルスコープ内で保存するため、タイプの競合またはタイプ情報の欠如を検出できます。また、この複合情報に基づいて、タイプ推論を実行できます。
具体的には、新しいフィールドを使用した次のASTノードの新しいバージョンWith提供されます: Module 、 FunctionDef 、 ClassDef 、 Assign 、 AnnAssign 、 For 。これらの新しいバージョンには、 StaticallyTyped...
これらの新しいフィールドで情報が収集されるエンティティのリストが続きます。
Moduleの場合:
FunctionDefの場合:
ClassDefの場合:
AssignとAnnAssignため:
Forために:
With :
AST書き換えは、上記の通常のASTノードを拡張バージョンに置き換えることを意味します。
Pythonバージョン3.5以降。
要件で指定されているPythonライブラリ。
さらに、テストの構築と実行には、test_requirements.txtにリストされているパッケージが必要です。
LinuxとWindowsでテストされています。