python 通过 ast 替换代码

2024-03-17 20:28
文章标签 python 代码 替换 ast

本文主要是介绍python 通过 ast 替换代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导航目录

      • 目录结构
      • 要替换的代码
      • 替换代码的逻辑
        • 新建类,继承 ast
        • 运行新建的类
        • 最最重要的一步
        • replace_code.py 完整代码
      • main.py 里面的代码
      • 执行结果
    • 最后

目录结构

.
├── hello
│   ├── __init__.py
│   └── utils.py
├── main.py
├── replace_code.py

要替换的代码

代码在文件 utils.py 里面

def sum(a: int, b: int) -> int:c = a - breturn c

替换代码的逻辑

替换代码逻辑在文件 replace_code.py 里

新建类,继承 ast

逻辑很简单:找到哪一行并替换,就是中间的判断可能比较多

import ast
class MyTransformer(ast.NodeTransformer):def visit(self, node: ast.AST):# 我们要找到要替换的那一行('c = a - b')代码在哪里for nodei, v in enumerate(node.body):if isinstance(v, ast.FunctionDef):for i, vv in enumerate(v.body):if isinstance(vv, ast.Assign) and \isinstance(vv.value, ast.BinOp) and \isinstance(vv.value.left, ast.Name) and \vv.value.left.id == 'a' and vv.value.right.id == 'b' and isinstance(vv.value.op, ast.Sub):# 找到了那一行代码# 找到后把新的代码通过 ast.parse 转换成语法树,并替换掉原来的代码v.body[i] = ast.parse('c = a + b').body[0]node.body[nodei] = vreturn node
运行新建的类
from hello import utils
import inspect
# 获取代码内容
method_code = inspect.getsource(utils.sum)
print(f'----sum code begin\n {method_code} \n -----sum code end ----')
# 把要替换的代码转换成语法树
method_ast = ast.parse(method_code)
trans_instance = MyTransformer()
# 运行新建的类的里面的逻辑
transformed_ast = trans_instance.visit(method_ast)
# 把语法树解析成语法代码
transformed_code = ast.unparse(transformed_ast)
print('--- transformed code:', transformed_code)
最最重要的一步

一定要把代码在它所在的命名空间里执行它

exec(transformed_code, utils.__dict__)
replace_code.py 完整代码
import ast
class MyTransformer(ast.NodeTransformer):def visit(self, node: ast.AST):for nodei, v in enumerate(node.body):if isinstance(v, ast.FunctionDef):for i, vv in enumerate(v.body):if isinstance(vv, ast.Assign) and \isinstance(vv.value, ast.BinOp) and \isinstance(vv.value.left, ast.Name) and \vv.value.left.id == 'a' and vv.value.right.id == 'b' and isinstance(vv.value.op, ast.Sub):print('here')v.body[i] = ast.parse('c = a + b').body[0]node.body[nodei] = vreturn node
from hello import utils
import inspect
method_code = inspect.getsource(utils.sum)
print(f'----sum code begin\n {method_code} \n -----sum code end ----')
method_ast = ast.parse(method_code)
trans_instance = MyTransformer()
transformed_ast = trans_instance.visit(method_ast)
transformed_code = ast.unparse(transformed_ast)
print('--- transformed code:', transformed_code)
exec(transformed_code, utils.__dict__)

main.py 里面的代码

导入的顺序一定不要错了,不然也不会生效的

# 引入的顺序一定不要错了,不然也不会生效的
import replace_code
from hello.utils import sum
if __name__ == '__main__':print(sum(2,1))

执行结果

----sum code begindef sum(a: int, b: int) -> int:c = a - breturn c-----sum code end ------- transformed code: def sum(a: int, b: int) -> int:c = a + breturn c
3 # 这是执行后的结果

最后

逻辑代码不一定要在 visit() 里面写,如果你要修改的是 for 循环里面的代码 你可以重写 visit_For()方法, 在里面来实现自己的逻辑

这篇关于python 通过 ast 替换代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/820051

相关文章

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

基于Python实现温度单位转换器(新手版)

《基于Python实现温度单位转换器(新手版)》这篇文章主要为大家详细介绍了如何基于Python实现温度单位转换器,主要是将摄氏温度(C)和华氏温度(F)相互转换,下面小编就来和大家简单介绍一下吧... 目录为什么选择温度转换器作为第一个项目项目概述所需基础知识实现步骤详解1. 温度转换公式2. 用户输入处

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式