Python AST node转为string(source code)

文章目录

前言

创作开始时间:2021年4月9日14:46:15

如题。在尝试了一番之后,决定同时使用:astor,astunparse,codegen,以及python内置的ast模块。

1、python内置ast模块

用这个就可以了:

ast.get_source_segment(file_str, node)

但是呢,会有问题:这几种类型的AST node识别不出来,会返回None:

  • alias
  • Store
  • Load
  • arguments
  • 等等。。。

太坑了,Python的ast解析确实没java这么细致。从这个角度来看,不是很友好。

2、使用astunparse或者astor

string = astor.to_source(node)

string = astunparse.unparse(node)

但是呢,也会报错,虽然他们两个能够识别alias,但是识别不了Store和Load,还有Usub之类的。

3、解决方案

在阅读了以上几个模块的源码之后,
在Python里面遇到以上无法解决的情况的时候,直接做特殊处理就行。比如:Usub无法识别,其实就是一个减号。直接处理一下就行了,不需要太麻烦哈。

应该还是比较简单的。

有时候会把代码贴上来。

所以总结一下:

如果需要把AST node转为string,那么可能需要同时用到:

  • Python内置ast模块
  • astor(或者astunparse,二选一,我倾向于astor,感觉好像更稳一点)
  • 自己写的异常处理(比如处理一下Usub这种AST node type)

小结

以上。

创作结束时间:2021年4月9日15:10:05

参考文献

Param, AugLoad, and AugStore can be safely ignored. As of Python 3.7, they never appear in an actual AST, and as of 3.9, they are completely gone, even at the implementation level.

astor can convert an AST back to readable Python code.

上一篇:【每日一题】【vue2源码学习】VUE中模版编译原理


下一篇:Lombok使用及原理分析