python3使用ast.parse详解

使用ast库分析python3脚本, 并对脚本进行一些处理, 比如注释pirnt语句

一.基础知识

官方网址连接
ast — Abstract Syntax Trees
ast库可以方便的分析python代码结构, 并做一些处理, 很适合对大量脚本文件做批量处理, 比如把print语句全部注释等.
直观的打印出代码结构

import ast

code = """
print('hello world')
"""

print(ast.dump(ast.parse('x = 1'), indent=4))

执行结果
在这里插入图片描述

二.如何遍历整个.py的语法结构

我们从上图中可以看到, body属性是一个数组, 对python的语法分析就是通过对body字段不断递归来做的, 可以通过对根节点body字段分析, 从而遍历整个文件的结构

三.如果想注释某些语句该怎么做

node有两个属性, linenoend_lineno, 代表的是该node的起始行和结束行
我们可以先直接读取py代码, 然后将起始行和结束行之间的每一个行, 都加上#注释, 即可做到不改变代码结构给某些语句加上注释

注释print的例子

import ast

code = """
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 False
	if not hasattr(n.value, 'func'):
		return False
	return getattr(n.value.func, 'id', None) == 'print'


def run(node):
	for n in node.body:
		if n is None:
			continue
		if 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 + "#" + line

		if hasattr(n, 'body'):
			run(n)


root = ast.parse(code)
run(root)
print('\n'.join(code_lines))

执行结果, 可以看到, 在不改变代码结构的情况下, 完美注释print语句
在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值