ast在python架构中的使用

AST学习
AST简介:
AST(Abstract syntac tree)是编译原理中的概念,是对源代码语法结构的一种抽象表示,它以树的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

下面的代码展示了以demo.py中的ast语法,对source_code.py中的内容进行修改,并将修改后的内容转回源代码并写入到target_code.py中,这个过程可以作为客户化定制的内容。
(mmlab中的config机制,采用了另一种方式,并不对config文件的语法进行解析,而是基于base congfig 对个人的config进行merge和替换,得到最终的config,然后通过底层维护的字符串到类的映射拿到config中字符串字段中type的字符串,从而拿到类及其参数)
以语法规则进行解析和更改后,可以生成可执行的python文件(虽然mmlab中的config也是.py文件,但它只是个config而无实际意义)
在这里插入图片描述

demo.py

import ast
import astor

# source_file 是任何一个.py文件的路径

with open("./ast_learning/source_code.py", 'r', encoding='utf-8') as f:
	source_code = f.read()
tree = ast.parse(source_code)

import_nodes = []
empty_lines = []
for node in ast.walk(tree):
	if isinstance(node, ast.ClassDef) and node.name == 'Classification_2d':
		class_node = node
	elif isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
		import_nodes.append(node)
	if isinstance(node, ast.Expr) and isinstance(node.value, ast.Str) and not node.value.s.strip():
		empty_lines.append(node.lineno)

copied_class_node = ast.copy_location(class_node, ast.ClassDef())
# 替换类节点中的__init__中的内容
for stmt in copied_class_node.body:
	if isinstance(stmt, ast.FunctionDef) and stmt.name == '__init__':
		for sub_stmt in stmt.body:
		# 遍历__init__中的所有操作(super,赋值等)
			if isinstance(sub_stmt, ast.Assign) and len(sub_stmt.targets) == 1 and isinstance(sub_stmt.targets[0], ast.Attribute) and sub_stmt.targets[0].attr == 'net':
				sub_stmt.value = ast.parse('models.convnext_large(pretrained=False)').body[0].value
				# 下面的方式会更改原来的sub_stmt.value 的 type 从_ast.Call object 变为 _ast.Name object 但 也是能用的
				# sub_stmt.value = ast.Name(id='models.resnet50(pretrained=False)', ctx=ast.Load(models.resnet50))
			if isinstance(sub_stmt, ast.Assign) and len(sub_stmt.targets) == 1 and isinstance(sub_stmt.targets[0], ast.Attribute) and sub_stmt.targets[0].attr == 'loss':
				sub_stmt.value = ast.parse('nn.CrossEntropyLoss').body[0].value
				# ast.parse不会改变node的type,
				# 几种其他方式的mode赋值
				# sub_stmt.value = ast.Name(id='nn.L1Loss', ctx=ast.Load()) # 会更改原本的value的type从_ast.Attribute object 变为_ast.Name object

code_tree=ast.Module(body=import_nodes+[copied_class_node])
# 四个空格作为每级缩进
copied_code = astor.to_source(code_tree, indent_with=' ' * 4)
with open("./ast_learning/target_code.py", 'w') as f:
	f.write(copied_code)

source_code.py

from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
import pytorch_lightning as pl
import torchvision.models as models
# import 的等级必须是models和nn
import torch.nn as nn

class Classification_2d(pl.LightningModule):
    def __init__(self, label_dict={},log_dir=''):
        super(Classification_2d, self).__init__()
        self.num_classes = len(label_dict)
        self.net=models.resnet18(pretrained=True)
        # resnet 系列
        self.fc = nn.Linear(self.net.fc.in_features, self.num_classes)
        self.net.fc = nn.Identity()
        
        self.loss=nn.L1Loss
        self.label_dict=label_dict
        self.label_to_name_dict={v:k for k,v in label_dict.items()}


        self.training_save=True
        self.log_dir=log_dir

target_code.py运行后的结果

from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
import pytorch_lightning as pl
import torchvision.models as models
import torch.nn as nn


class Classification_2d(pl.LightningModule):

    def __init__(self, label_dict={}, log_dir=''):
        super(Classification_2d, self).__init__()
        self.num_classes = len(label_dict)
        self.net = models.convnext_large(pretrained=False)
        self.fc = nn.Linear(self.net.fc.in_features, self.num_classes)
        self.net.fc = nn.Identity()
        self.loss = nn.CrossEntropyLoss
        self.label_dict = label_dict
        self.label_to_name_dict = {v: k for k, v in label_dict.items()}
        self.training_save = True
        self.log_dir = log_dir

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷视频看到的联通流量卡广告,19元210G能买吗?

现在为了争夺客户资源,三大运营商纷纷发力,推出了各种优惠套餐,就比如:前段时间电信推出29元155G长期套餐,移动29元135G本地套餐,广电19元192G套餐。 当然,联通也是不甘示弱,也跟上…

简单版的数组实现哈希表

package com.wei.mybatisflex;import java.util.ArrayList; import java.util.List;/*** 用数组实现哈希表*/ public class ArrayToHash {/*** 键值对定义*/class Pair{private int key;private String val;public Pair(int key, String val) {this.key key;this.val val;}}p…

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以

本地验证时重定向iperf包有出现calltrace错误&#xff0c;经推断&#xff0c;系统PAGE_SIZE<8k时可能出现&#xff08;getconf PAGE_SIZE指令可查看&#xff09;&#xff0c;按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次&#xff0c;需要将加载…

Apollo自动驾驶:引领未来的智能出行

自动驾驶技术正日益成为当今科技领域的焦点&#xff0c;它代表着未来出行的一大趋势&#xff0c;而Baidu公司推出的Apollo自动驾驶平台则在这一领域中展现出强大的领导地位。本文将深入探讨Apollo自动驾驶技术的关键特点、挑战以及它对未来智能出行的影响。 Apollo自动驾驶平台…

机器学习算法的选择和优化技巧

文章目录 机器学习算法的选择1. 问题类型&#xff1a;2. 数据规模&#xff1a;3. 特征空间&#xff1a;4. 数据质量&#xff1a; 机器学习算法的优化技巧1. 特征工程&#xff1a;2. 超参数调优&#xff1a;3. 集成方法&#xff1a;4. 模型调优&#xff1a; 代码示例&#xff1a…

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

一文了解汽车芯片的分类及用途介绍

汽车芯片按其功能可分为控制类&#xff08;MCU和AI芯片&#xff09;、功率类、传感器和其他&#xff08;如存储器&#xff09;四种类型。市场基本被国际巨头所垄断。人们常说的汽车芯片是指汽车里的计算芯片&#xff0c;按集成规模可分为MCU芯片和AI芯片&#xff08;SoC芯片&am…

Python-主线程控制子线程-3

需求&#xff1a;在Python-主线程控制子线程结束-2的基础上&#xff0c;添加在子线程中执行操作并获取结果的功能。 一种常见的方法是使用队列&#xff08;Queue&#xff09;或者共享变量&#xff0c;在子线程中存储结果&#xff0c;然后在主线程中获取这些结果。这种方法可以…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…

ElementUI Table 翻页缓存数据

Element UI Table 翻页保存之前的数据,网上找了一些,大部分都是用**:row-key** 和 reserve-selection,但是我觉得有bug,我明明翻页了…但是全选的的个框还是勾着的(可能是使用方法不对,要是有好使的…请cute我一下…感谢) 所以自己写了一个… 思路: 手动勾选的时候,将数据保存…

借助frp的xtcp+danted代理打通两边局域网p2p方式访问

最终效果 实现C内网所有设备借助c1内网代理访问B内网所有服务器 配置公网服务端A frps 配置frps.ini [common] # 绑定frp穿透使用的端口 bind_port 7000 # 使用token认证 authentication_method token token xxxx./frps -c frps.ini启动 配置service自启(可选) /etc/…

【Unity3D】水面特效

1 前言 水波特效 中通过屏幕后处理实现了环形水波效果&#xff0c;本文通过 Shader Graph 实现了模拟水面特效&#xff0c;包含以下特效细节。Shader Graph 基础知识详见→Shader Graph简介、Shader Graph节点、程序纹理简单应用。 深水区和浅水区颜色差异&#xff1b;水面有波…

[C#][原创]操作注册表一些注意点

C#注册表只需要引入 using Microsoft.Win32; C#注册表操作都是通过2个类Registry和RegistryKey进行所有操作。但是有些基本注意事项经常忘记&#xff0c;不常用就很容易忘记。 第一&#xff0c;打开注册表&#xff0c;第2个bool参数问题&#xff1a; RegistryKey key Regi…

python解析小说

前言 在信息爆炸的时代&#xff0c;网络上充斥着大量的小说资源&#xff0c;让人们能够随时随地尽享阅读的乐趣。然而&#xff0c;有些小说网站要求用户付费才能获取完整的内容&#xff0c;这给许多人带来了困扰&#xff0c;尤其是像我这类对金钱概念模糊的人。不过&#xff0…

Redis企业级解决方案

缓存预热 “ 宕机 ” 服务器启动后迅速宕机 问题排查 1. 请求数量较高 2. 主从之间数据吞吐量较大&#xff0c;数据同步操作频度较高 , 因为刚刚启动时&#xff0c;缓存中没有任何数据 解决方案 准备工作&#xff1a; 1. 日常例行统计数据访问记录&#xff0c;统计访…

STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

今日学习一下红外遥控的解码使用&#xff0c;红外遥控在日常生活必不可少&#xff0c;它的解码与使用也是学习单片机的一个小过程&#xff0c;我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理&#xff1a; 红外遥控特点&#xff1a; …

FPGA_学习_17_IP核_ROM(无延迟-立即输出)

由于项目中关于厂商提供的温度-偏压曲线数据已经被同事放在ROM表了&#xff0c;我这边可用直接调用。 今天在仿真的时候&#xff0c;发现他的ROM表用的IP核是及时输出的&#xff0c;就是你地址给进去&#xff0c;对应地址的ROM数据就立马输出&#xff0c;没有延迟。 我打开他的…

c++代码代码逻辑走查

自助生物采集代码 C部分流程

上传镜像到阿里云的ACR

1、开通阿里云ACR 2、在ACR 中创建命名空间 3、本地安装docker 4、登录到 开通ACR&#xff0c;需要配置访问凭证 [rootmaster ~]# docker login --username***lb registry.cn-beijing.aliyuncs.com Password: 5、给镜像打标签 [rootmaster ~]# docker images REPOSITORY …

IDEA项目实践——Element UI概述

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring当中的切面AOP IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 IDEA项目实践——动态SQL、关系映射、注解开发 IDEWA项目实践——mybatis的一些基本原理以及案例 文章目录 …