Augument Python 3帶有靜態類型信息的抽象語法樹(ASTS)。
Python是一種動態鍵入的編程語言。但是,即使在靜態鍵入中,通常會看到的python代碼也可以工作!
使用此軟件包,可以將靜態類型信息插入python抽象語法樹(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個主要步驟:
在所有適用的節點中,類型提示都存儲在字段type_comment , annotation和returns 。類型提示解析器讀取這些字段 - 它們是原始字符串或ASTS。
它使用提供的Python符號表來解決類型提示使用內省的實際類型對象。
默認情況下,解析器僅在直接調用或通過augment()時使用內置符號。但是,當通過parse()調用時,默認情況下使用呼叫者的globals()和locals() 。
解決類型的提示直接存儲在AST中。具體而言,每個已解決的字段都存儲在一個相應地命名的字段中,該字段要么是resolved_type_comment , resolved_annotation或resolved_returns 。
因此,靜態類型信息在AST中可用。
對於可能包含任何名稱聲明的每個AST節點,提供了一個節點的排出版本。每個擴展的AST節點都有新字段,可存儲與每個名稱關聯的那些聲明的名稱和類型信息。
這些新字段在任何本地範圍內存儲了所有分析類型提示中的所有類型信息,因此可以檢測到類型沖突或缺乏類型信息。同樣,基於此組合信息,可以執行類型推理。
具體來說,提供了帶有新字段的以下AST節點的新版本: Module , FunctionDef , ClassDef ,cassdef, Assign , AnnAssign , For and and and With 。這些新版本的名稱前綴為StaticallyTyped...
以下是在這些新領域收集信息的實體列表。
對於Module :
For FunctionDef :
對於ClassDef :
用於Assign和AnnAssign :
For :
With :
AST重寫意味著替換上面列出的擴展版本列出的普通AST節點。
Python版本3.5或更高版本。
python庫,如unignts.txt中指定。
構建和運行測試還需要test_requirements.txt中列出的軟件包。
在Linux和Windows上測試。