向python抽象语法树添加静态类型信息
static-typing的Python项目详细描述
带有静态类型信息的AugumentPython3抽象语法树(ASTS)。
python是一种动态类型的编程语言。 然而,大多数常见的python代码即使是静态类型的也可以工作!
有了这个包,可以将静态类型信息插入到python抽象语法树(asts)中, 所以假设给定的代码在python是静态类型的情况下可以工作, 在执行之前,可以静态地对代码中的类型进行推理。
这种增强的ast主要用于使用其他工具进行分析/消费。
最适合使用来自typed_astmodule的asts,但是它也适用于内置的astmodule。
请注意,这是一项正在进行的工作,目前的执行情况可能会发生突然变化。
python 3.8发布后,将不再支持typed_ast,因为它的功能将 合并到内置的ast解析器中。
内容
如何使用
您可以使用static_typing模块直接使用parse()函数解析代码:
importstatic_typingasstclassMyClass:passmodule=st.parse('def my_fun(obj: MyClass) -> MyClass: return obj')# TODO: currently there is no public API yetfunctions=module._functionsmy_fun=module._functions['my_fun']assertMyClassinmy_fun._params['obj']
或者,可以使用{TT6}$函数扩充现有的AST:
importstatic_typingasstimporttyped_ast.ast3module=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 yetfunction=module._functions['spam']assertlen(function._local_vars)==3assertfloatinfunction._local_vars['z']
有关更多示例,请参见examples.ipynb笔记本。
ast操作
除了主要功能之外,库还包含static_typing.ast_manipulation 包含低级工具和构建基块的模块,允许:
- 递归ast遍历,
- AST验证,
- 递归ast转换,
- ast转录(从typed_ast到内置的ast,反之亦然)和
- 解析类型提示(在下面详细描述)。
如何实施
augment()函数实现的进程或静态类型有3个主要步骤:
- 键入提示分辨率,
- 类型信息组合和
- AST重写。
类型提示分辨率
在所有适用的节点中,类型提示存储在字段type_comment,^{tt12}中$ 以及returns。类型提示解析器读取那些字段-其中七个是原始字符串 或者阿斯特。
它使用提供的python符号表将类型提示解析为使用 反省。
默认情况下,解析器在直接调用或通过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:
- 参数及其类型
- 返回类型
- 种类(即功能、仪表ance方法、类方法、静态方法等)
- 局部变量及其类型
对于ClassDef:
- 定义的方法(全部按种类分组)
- 类字段及其类型
- 实例字段及其类型
对于Assign和AnnAssign:
- 分配目标及其类型
对于For:
- 索引变量及其类型
对于With:
- 上下文变量及其类型
ast重写
ast重写意味着用扩展版本替换上面列出的普通ast节点。
要求
python 3.5或更高版本。
在requirements.txt中指定的python库。
生成和运行测试还需要test_requirements.txt中列出的包。
在Linux和Windows上测试。