当前位置: 首页> 财经> 创投人物 > python3使用ast.parse详解

python3使用ast.parse详解

时间:2025/7/13 19:00:42来源:https://blog.csdn.net/qq_40666620/article/details/139992690 浏览次数:0次

使用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有两个属性, linenoend_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语句
在这里插入图片描述

关键字:python3使用ast.parse详解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: