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上测试。