在数据分析、notebook 转生产代码、ai 生成代码清洗等场景中,我们经常需要:
自动删除 print()、dataframe.head()、plt.show()、to_html() 等仅用于展示的代码,而不影响业务逻辑
正则不可靠,ast 才是王道。
本文将通过一个完整可运行示例,教你如何使用 python ast 对源码进行结构级修改。
一、使用 ast 的优势
| 方式 | 问题 |
|---|---|
| 正则字符串 | 易误删、难维护 |
| ast 抽象语法树 | 语法级安全、精准删除 |
二、环境准备
pip install astor
ast:python 内置模块astor:将 ast 转回源码
三、目标效果
删除以下代码:
print(...) df.head() plt.show() data.to_html()
四、完整可运行代码(⭐重点)
复制即可运行
import ast
import astor
class methodcallremover(ast.nodetransformer):
"""
ast 修改器:
1. 删除指定方法调用(如 head / show / to_html)
2. 删除整行 print(...) 代码
"""
def __init__(self, method_names):
self.method_names = method_names
def visit_call(self, node):
"""
删除嵌套的方法调用,例如:
data.to_html()
df.head()
"""
if isinstance(node.func, ast.attribute):
if node.func.attr in self.method_names:
return none
return self.generic_visit(node)
def remove_print_and_show(self, tree):
"""
删除顶层的 print / show / head 语句(整行)
"""
new_body = []
for node in tree.body:
# 删除 print(...)
if (
isinstance(node, ast.expr)
and isinstance(node.value, ast.call)
and isinstance(node.value.func, ast.name)
and node.value.func.id == "print"
):
continue
# 删除 obj.show() / obj.head()
if (
isinstance(node, ast.expr)
and isinstance(node.value, ast.call)
and isinstance(node.value.func, ast.attribute)
and node.value.func.attr in self.method_names
):
continue
new_body.append(node)
tree.body = new_body
return tree
# ===================== 测试代码(示例) =====================
code = """
import pandas as pd
import matplotlib.pyplot as plt
data = pd.dataframe({
'a': [1, 2, 3],
'b': [4, 5, 6]
})
print("原始数据:")
print(data)
data.head()
plt.plot(data['a'], data['b'])
plt.title("测试图表")
plt.show()
html = data.to_html()
print(html)
"""
# ===================== ast 处理流程 =====================
# 1. 解析为 ast
tree = ast.parse(code)
# 2. 要删除的方法名
methods_to_remove = [
"head",
"show",
"render",
"render_notebook",
"to_html",
]
# 3. 执行清洗
remover = methodcallremover(methods_to_remove)
new_tree = remover.remove_print_and_show(tree)
# 4. 转回源码
clean_code = astor.to_source(new_tree)
# 5. 输出结果
print("====== 清洗后的代码 ======")
print(clean_code)
五、运行前后对比
清洗前
print(data) data.head() plt.show() data.to_html()
清洗后
data = pd.dataframe(...)
plt.plot(...)
plt.title("测试图表")
只保留业务逻辑,彻底移除展示代码
六、核心原理解析(简要)
ast 中关键节点:
| 节点 | 含义 |
|---|---|
| ast.expr | 独立的一行 |
| ast.call | 函数/方法调用 |
| ast.attribute | obj.method |
只要识别出:
expr(
value=call(
func=attribute(attr="head")
)
)
就能 整行删除。
七、适用场景
notebook 转生产脚本
ai 生成代码自动去噪
pandas / matplotlib 批量清洗
自动化代码重构
企业代码规范化
八、可扩展方向(进阶)
- 自动删除所有
plt.* - ast 自动加日志
- ast + llm 代码修复
- 批量处理
.py文件
九、结语
ast 是 python 工程师的“代码手术刀”
当你开始用 ast,你会发现:
- 正则 = 土办法
- ast = 工程级解决方案
到此这篇关于python ast自动移除print/head/show/to_html无用代码的文章就介绍到这了,更多相关python ast移除无用代码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论