向python抽象语法树添加静态类型信息

static-typing的Python项目详细描述


带有静态类型信息的AugumentPython3抽象语法树(ASTS)。

package version from PyPIbuild status from Travis CIbuild status from AppVeyorgrade from Codacytest coverage from Codecovlicense

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_commentresolved_annotationresolved_returns

因此,静态类型信息在ast中变得可用。

类型信息组合

对于可能包含任何名称声明的每个ast节点,节点的扩展版本 提供。每个扩展的ast节点都有新的字段来存储那些声明的名称和类型 与每个名称相关联的信息。

这些新字段存储来自任何本地范围内所有解析类型提示的所有类型信息, 以便可以检测到类型冲突或缺少类型信息。另外,基于这个组合 信息,可以进行类型推断。

具体地说,提供了具有新字段的下列ast节点的新版本:ModuleFunctionDefClassDefAssignAnnAssignForWith。那些新版本 以他们的名字为前缀StaticallyTyped...

下面是在这些新字段中收集信息的实体的列表。

对于Module

  • 定义变量
  • 定义的函数
  • 定义的类

对于FunctionDef

  • 参数及其类型
  • 返回类型
  • 种类(即功能、仪表ance方法、类方法、静态方法等)
  • 局部变量及其类型

对于ClassDef

  • 定义的方法(全部按种类分组)
  • 类字段及其类型
  • 实例字段及其类型

对于AssignAnnAssign

  • 分配目标及其类型

对于For

  • 索引变量及其类型

对于With

  • 上下文变量及其类型

ast重写

ast重写意味着用扩展版本替换上面列出的普通ast节点。

要求

python 3.5或更高版本。

requirements.txt中指定的python库。

生成和运行测试还需要test_requirements.txt中列出的包。

在Linux和Windows上测试。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
swing Java按钮/网格布局   java列出Google日历中的所有事件   java无效:单击API publisher test按钮后连接到后端时出错   带有内部赋值的java While循环导致checkstyle错误   java为什么trimToSize/ensureCapacity方法提供“公共”级访问?   文件输出流的java问题   ListIterator和并发修改异常的java问题   java如何使用两个URL映射   无法识别使用“./../”构造的字符串java相对路径,为什么?   首次写入remotelyclosedsocket不会触发异常,对吗?JAVA   java OneDrive REST API为文件上载提供了400个无效谓词   Java泛型、集合接口和对象类的问题   OpenSSL Java安全提供程序   jmeter java运行jmx禁用操作