ast在python架构中的使用

这篇具有很好参考价值的文章主要介绍了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而无实际意义)
ast在python架构中的使用,python,AST

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运行后的结果文章来源地址https://www.toymoban.com/news/detail-666389.html

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

到了这里,关于ast在python架构中的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Builder AST 转换为流式API

    从Groovy 2.3开始,我们可以使用 @Builder AST转换轻松地为我们的类创建一个流畅的API。 我们可以将注释应用于我们的类,结果类文件将具有支持流畅API的所有必要方法。 我们可以自定义如何使用不同的注释参数生成流畅的API。 在Groovy代码中,我们已经可以使用 with 方法 有一个

    2024年02月07日
    浏览(36)
  • 带你揭开神秘的javascript AST面纱之AST 基础与功能

    作者:京东科技 周明亮 在前端里面有一个很重要的概念,也是最原子化的内容,就是 AST ,几乎所有的框架,都是基于 AST 进行改造运行,比如:React / Vue /Taro 等等。 多端的运行使用,都离不开 AST 这个概念。 在大家理解相关原理和背景后,我们可以通过手写简单的编译器,

    2023年04月12日
    浏览(28)
  • 网页爬虫逆向与AST入门系列教程(七、AST的应用之代码转换)

    在前面的文章中,我们已经介绍了AST的基本概念,生成方法以及在代码混淆解析、反爬虫技术解析和数据提取与分析中的应用。在本篇中,我们将继续探讨AST在网页爬虫逆向中的另一个关键领域:代码转换。 1. 代码转换简介 代码转换是指通过对代码进行解析、修改和重新生

    2024年02月12日
    浏览(42)
  • 网页爬虫逆向与AST入门系列教程(八、AST的应用之安全检测)

    在前面的文章中,我们已经介绍了AST的基本概念、生成方法以及在代码混淆解析、反爬虫技术解析、数据提取与分析以及代码转换中的应用。在本篇中,我们将继续探讨AST在网页爬虫逆向中的另一个重要领域:安全检测。 1. 安全检测的重要性 在进行网页爬虫逆向工作时,安

    2024年02月16日
    浏览(46)
  • 网页爬虫逆向与AST入门系列教程(四、AST的应用之代码混淆解析)

    前面的文章中,我们介绍了AST的基本概念、生成和可视化方法。在本篇中,我们将探讨AST在网页爬虫逆向中的另一个重要应用领域:代码混淆解析。 1. 代码混淆与反混淆 代码混淆是一种常见的技术,用于增加网页代码的复杂性和混淆程度,从而防止被不法分析者轻易地理解

    2024年02月11日
    浏览(48)
  • 网页爬虫逆向与AST入门系列教程(六、AST的应用之数据提取与分析)

    在前面的文章中,我们介绍了AST的基本概念、生成方法以及在代码混淆解析和反爬虫技术解析中的应用。在本篇中,我们将探讨AST在网页爬虫逆向中另一个重要的应用领域:数据提取与分析。 1. 数据提取与分析简介 数据提取与分析是指从网页中提取出所需的数据,并对其进

    2024年02月12日
    浏览(59)
  • 简析vue文件编译——AST

    简介 首先了解一个概念 AST ( abstract syntax tree )抽象语法树,按照大多数教程中的描述,这是一种源代码的抽象语法结构树,树上的每个节点都表示源代码中的一种结构,将源码中的各种嵌套括号等形式,隐含在树的结构中,不依赖于源语言的语法。这个概念不但名称AST很抽

    2024年02月10日
    浏览(21)
  • 抽象语法树AST必知必会

    打开前端项目中的 package.json,会发现众多工具已经占据了我们开发日常的各个角落,例如 JavaScript 转译、CSS 预处理、代码压缩、ESLint、Prettier 等。这些工具模块大都不会交付到生产环境中,但它们的存在于我们的开发而言是不可或缺的。 有没有想过这些工具的功能是如何实

    2024年02月16日
    浏览(47)
  • JavaScript补环境及AST实战

    强烈推荐,适合爬虫,js逆向,js逆向小白、爬虫工程师、反爬工程师等等。 -----AST入门实战+零基础JavaScript补环境 采取直播 + 录播形式。每节课时长约30-60分钟,一共大概80集。预计3-4个月更新完毕。专用加密软件播放,需绑定电脑,支持windows和苹果系统。 感兴趣者,私信本

    2024年02月16日
    浏览(27)
  • 以 Golang 为例详解 AST 抽象语法树

    各位同行有没有想过一件事,一个程序文件,比如 hello.go 是如何被编译器理解的,平常在编写程序时,IDE 又是如何提供代码提示的。在这奥妙无穷的背后, AST(Abstract Syntax Tree) 抽象语法树功不可没,他站在每一行程序的身后,默默无闻的工作,为繁荣的互联网世界立下了

    2024年01月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包