面向人的ast解析器/unparser

horast-rereleased的Python项目详细描述


面向人类的抽象语法树(AST)语法分析器/不丢弃注释的Python3的unparser。在

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

此包提供新的AST节点类型(Comment和Directive),它们继承自typed中的节点_ast.ast3型模块。 此外,它还为扩展的AST提供了解析器和unparser的实现 简单易读的代码生成。在

如何使用此软件包的简单示例:

fromhorastimportparse,unparsetree=parse("""a = 1  # a equals one after this""")print(unparse(tree))# this will print the code with original comment

更多示例见examples.ipynb。在

技术细节

解析器基于内置的标记化模块,以及社区包asttokens和typed-ast。在

Unparser本质上是静态类型包Unparser类的扩展。在

horast提供和处理的节点如下所示。在

评论

当整行和行尾注释在外部时,它们被正确地解析/取消分析 多行表达式。在

目前,多行表达式中的注释处理仅部分实现。在

BlockComment

尚未实现。

此节点类型用于在 单个AST节点,因此简化了对大型注释块的处理。在

指令

因为Python没有提供直接的方法来用代码来传递指令, 以下列任何前缀开头的注释将不会被分类 作为典型评论,但作为指示:

  • 如果
  • 其他
  • 结束语
  • 定义
  • 未定义
  • ifdef公司
  • ifndef公司

然而,在Python代码中,它们仍然像往常一样保留注释。在

例如,下面代码中的注释都将被归类为指令。在

^{pr2}$

但是,当作为Python执行时,debugging将始终以^{tt2}结尾$ 因为指令在Python中保留为通常的注释,因此 它们被忽略了。在

因此,Directive节点不是用来启用 Python,至少现在是这样。在

注意:前缀已正确检查。请参见以下示例:

#if something# if some other thing

第一行中的注释将成为Directiveobject,而 第二个like将变成Commentobject。在

目前,此节点旨在实现 Python和其他语言,帮助从Python AST生成代码 在其他语言中–一个这样的用例是 *transpyle* project。在

Pragma

Pragma节点遵循与Directive节点相同的一般规则,即它们是 作为注释存储在Python代码中,但注释将被分类为pragma 如果前缀为预定义前缀:

  • " pragma:"

此外,Pragma的两个子类在horast中定义,每个子类都有 基于泛型pragma前缀的own前缀:

  • OpenMpPragmaclass定义前缀" pragma: omp",并存储OpenMP pragma。在
  • OpenAccPragmaclass定义前缀" pragma: acc",并存储OpenACC杂注。在

下面的代码片段包含所有3种pragma类型。在

# pragma: onceuse_openmp=Trueuse_openacc=True...a,b=np.ndarray(...)c=np.zeros(...)# pragma: acc parallel copyin(a,b) copyout(c)# pragma: acc loop gangforyinrange(ymax):# type: np.int32# pragma: acc loop workerforiinrange(imax):# type: np.int32# pragma: acc loop vector reduction(+: c[y][x])forxinrange(xmax):# type: np.int32c[y,x]+=a[y,i]*b[i,x]# pragma: acc end parallel...# pragma: omp parallel doforiinrange(input_data.size):# type: int# here we compute spam spam spamheavy_compute(input_data[i])...

因此,在上面的例子中:

  • 所有以" pragma: omp"开头的注释都成为OpenMpPragma对象
  • 所有以" pragma: acc"开头的注释都成为OpenAccPragma对象
  • 所有其他以" pragma:"开头的注释都变成Pragma对象
  • 忽略类型注释,并且
  • 所有其他注释都成为Comment对象。在

此外,horast模块提供了一个可扩展的基础设施来定义 自定义Pragma子类,允许用户为定义自己的pragma 实验。提供的OpenMP和OpenACC pragma定义提供 作为如何使用此功能的示例。在

包括

与pragma的处理方式类似,如果注释以^{tt21}开头$ 前缀,它将被归类为一种特殊的include direct伊夫。在

同样,这将在Python代码中作为注释保存,但它很有用 为了增强Python和其他语言之间的语法兼容性,特别是 静态编译语言。在

要求

CPython 3.5或更高版本。在

requirements.txt中指定的Python库。在

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

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

推荐PyPI第三方库


热门话题
java ArrayIndexOutOfBoundsException,但不访问任何索引   用JAVA代码复制的奇怪结果   基于当前用户的Java目标目录   运行时错误java scanner不接受中间有空格的两个单词   java Android从editText获取文本   枚举内的java搜索   java自定义布局高度包装内容,而不是使用定义的布局高度   Java 5中引入的Enum类的用途是什么?   excel如何在java swing中查看xls文档   java如何模拟影响对象的void返回方法   Java线程之间的多线程数据交换   JavaSpring引导:库是否会从父应用程序/服务获取依赖关系   java经过一段时间的循环:为什么刚刚写入的数组是空的?   Regex和java忽略引号内的关键字和字符串   oracle我正在从java读取文本文件(逗号作为分隔符)