使用ast
库分析python3脚本, 并对脚本进行一些处理, 比如注释pirnt
语句
一.基础知识
官方网址连接
ast — Abstract Syntax Trees
ast库可以方便的分析python代码结构, 并做一些处理, 很适合对大量脚本文件做批量处理, 比如把print
语句全部注释等.
直观的打印出代码结构
import astcode = """
print('hello world')
"""print(ast.dump(ast.parse('x = 1'), indent=4))
执行结果
二.如何遍历整个.py
的语法结构
我们从上图中可以看到, body
属性是一个数组, 对python的语法分析就是通过对body
字段不断递归来做的, 可以通过对根节点
的body
字段分析, 从而遍历整个文件的结构
三.如果想注释某些语句该怎么做
node有两个属性, lineno
和end_lineno
, 代表的是该node的起始行和结束行
我们可以先直接读取py
代码, 然后将起始行和结束行之间的每一个行, 都加上#
注释, 即可做到不改变代码结构
给某些语句加上注释
注释print的例子
import astcode = """
a = 1
print("adefwefwefwe")
def test():print('feafwea''fwefwfaw')
b = 2
"""
code_lines = code.split('\n')def is_print_node(n):if not isinstance(n, ast.Expr):return Falseif not hasattr(n.value, 'func'):return Falsereturn getattr(n.value.func, 'id', None) == 'print'def run(node):for n in node.body:if n is None:continueif is_print_node(n):prefix = code_lines[n.lineno - 1][:n.col_offset]line = code_lines[n.lineno - 1]code_lines[n.lineno - 1] = prefix + "pass #" + line# 多行print一起注释for i in range(n.lineno, n.end_lineno):line = code_lines[i]if i <= n.end_lineno:code_lines[i] = prefix + "#" + lineif hasattr(n, 'body'):run(n)root = ast.parse(code)
run(root)
print('\n'.join(code_lines))
执行结果
, 可以看到, 在不改变代码结构的情况下, 完美注释print
语句