ast在python架构中的使用

news2025/2/24 3:33:23

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实景无人直播小白如何操作?抖音/直播带货/实况

在当今数字娱乐领域实景无人直播系统成为了一种备受关注的娱乐方式。这种系统能够将真实场景以实时视频的形式传输到用户终端,让用户可以身临其境地观赏各种精彩的场景。本文将深入探讨实景无人直播系统的操作指南,旨在为读者提供专业性、思考深度和逻辑…

简单版的数组实现哈希表

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…

java八股文面试[数据结构]——HashMap和HashTable区别

HashMap源码中的重要常量 DEFAULT_INITIAL_CAPACITY: HashMap的默认容量,16 MAXIMUM_CAPACITY: HashMap的最大支持容量,2^30 TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树。 UNTREEIFY_THRESHOLD…

无涯教程-PHP - 返回类型声明

在PHP 7中&#xff0c;引入了一个新函数返回类型声明&#xff0c;返回类型声明指定函数应返回的值的类型&#xff0c;可以声明返回类型的以下类型。 intfloatbooleanstringinterfacesarraycallable 有效返回类型 <?phpdeclare(strict_types1);function returnIntValue(i…

Java课题笔记~Element UI

Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库&#xff0c;用于快速构建网页。 Element 提供了很多组件&#xff08;组成网页的部件&#xff09;供我们使用。例如 超链接、按钮、图片、表格等等~ 如下图左边的是我们编写页面看到的按钮&#…

如何基于亚马逊云科技打造高性能的 SQL 向量数据库 MyScale

MyScale 是一款完全托管于亚马逊云科技、支持 SQL 的高效向量数据库。MyScale 的优势在于&#xff0c;它在提供与专用向量数据库相匹敌甚至优于的性能的同时&#xff0c;还支持完整的 SQL 语法。在这篇文章中&#xff0c;我们将阐述 MyScale 是如何借助亚马逊云科技的基础设施&…

攻防世界-simple_js

原题 解题思路 js就看源代码&#xff0c;pass是数字&#xff0c;下面还有一串十六进制的编码。 进制转换就是&#xff0c;也是一串数字&#xff0c;那把这两串数字都拿去转ASCII码。 s1 [55,56,54,79,115,69,114,116,107,49,50] s2 [70,65,85,88,32,80,65,83,83,87,79,82,68…

Linux TCP编程流程

一、TCP编程流程 TCP 提供的是面向连接的、可靠的、字节流服务。TCP的服务器端和客户端编程流程如下&#xff1a; 1.socket()方法 用来创建一个套接字&#xff0c;有了套接字就可以通过网络进行数据的收发。这也是为什么进行网络通信的程序首先要创建一个套接字。创建套接字时…

SqlServer2019—解决SQL Server 无法连接127.0.0.1的问题

1、打开SQL Server 2019配置管理器 2、SQL Servere 网络配置(启用 Named Pipes 和 TCP/IP) 3、修改TCP/IP协议(右键选择属性—IP地址)&#xff0c;具体如下图所示&#xff1a; 4、重启SQL Server服务

QT通过ODBC连接GBase 8s数据库(Windows)示例

示例环境&#xff1a; 操作系统&#xff1a;Windows 10 64位数据库及CSDK版本&#xff1a;GBase 8s V8.8_3.0.0_1 64位QT&#xff1a;5.12.0 64位 1&#xff0c;CSDK安装及ODBC配置 1.1&#xff0c;免安装版CSDK 下载免安装版的CSDK驱动&#xff0c;地址&#xff1a;https:…

盛最多水的容器——力扣11

int maxArea(vector<int>& height) {int l=0, r=height.size()

企业如何通过CRM系统获得更多商机?

商机是销售的基础&#xff0c;如何获取更多的商机&#xff0c;是每个企业都关心的问题。通过传统的营销方式来吸引潜在客户&#xff0c;往往成本高、效果低、难以管理。那么有没有一种方式&#xff0c;既节省时间和成本&#xff0c;又可以获取更多商机&#xff1f;当然有&#…

AUTOSAR配置与实践(配置篇) 如何条件控制PDU外发

AUTOSAR配置与实践(配置篇)如何条件控制PDU外发 一、需求1.1 需求简要分析1.2 需求进一步分析二、流程实现和具体配置一、需求 需要针对特定的PDU(外发)进行条件控制,这里要通过不同配置字进行PDU是否外发的控制 1.1 需求简要分析 正常PDU分组时分为两组,接收报文组和…

Javase(中)

一、面向对象进阶 1、static&#xff08;静态是共享的&#xff09; 静态变量 特点&#xff1a;修饰的成员变量被该类的所有对象共享 静态方法 静态方法只能调用静态的东西&#xff0c;非静态方法可以调用所有 static 的注意事项 static的内存图 重识main方法 2、工具类、测…

23.8.11.用apifox端口号与java接口链接的时候少了个/导致连接不成功。

用apifox端口号与java接口链接的时候少了个/导致连接不成功。 原因分析&#xff0c;因为拼接的位置少了个/ 如图所示

电工-三相异步电动机启动电流很大的原因与不利影响

电工-三相异步电动机启动电流很大的原因与不利影响 所谓电动机的启动是指电动机从接入电源开始转动起&#xff0c;到达到额定转速为止的这一过程。 根据理论分析和实际测定&#xff0c;异步电动机启动瞬间&#xff1b;定子绕组启动电流很大&#xff0c;可达额定值的4~7倍。为什…

家庭智慧管控中心——酷开系统全时AI

智能家居入口在哪&#xff1f; 或许你家已经有了&#xff01;举个例子&#xff0c;智能电视就是其中的一种&#xff01;智能家电的变革进度逐渐加深&#xff0c;人们对于智慧生活的需求也逐渐提高。伴随着人工智能、物联网、大数据等信息技术的发展&#xff0c;家电产品的智能化…

Camunda 7.x 系列【23】身份服务 IdentityService

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 相关表3. IdentityService1. 概述 在之前我们演示了一个简单的请假流程,接下来…

上篇——税收大数据应用研究

财税是国家治理的基础和重要支柱&#xff0c;税收是国家治理体系的重要组成部分。我们如何利用税收数据深入挖掘包含的数据价值&#xff0c;在进行数据分析&#xff0c;提升税收治理效能&#xff0c;推进税收现代化。 1. 定义与特点 对于“大数据”&#xff08;Big data&#…

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…