【Pytorch 库】自定义数据集相关的类
- torch.utils.data.Dataset 类
- torch.utils.data.DataLoader 类
- 自定义数据集示例
- 1. 自定义 Dataset 类
- 2. 在其他 .py 文件中引用和使用该自定义 Dataset
- torch_geometric.data.Dataset 类
- torch_geometric.data.Dataset VS torch.utils.data.Dataset
详细信息,参阅 torch.utils.data 文档页面
写得很棒的文章:PyTorch加载自己的数据集
在 PyTorch 数据加载工具的核心是 torch.utils.data.DataLoader
类。它表示一个 Python 可迭代对象,用于遍历数据集,并支持以下功能:
- 映射式和可迭代式数据集
- 自定义数据加载顺序
- 自动批量处理
- 单进程和多进程数据加载
- 自动内存固定
这些选项由 DataLoader
构造函数的 参数 配置,如下:
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,batch_sampler=None, num_workers=0, collate_fn=None,pin_memory=False, drop_last=False, timeout=0,worker_init_fn=None, *, prefetch_factor=2,persistent_workers=False)
DataLoader
构造函数中最重要的参数是 dataset
,它表示一个数据集对象,用于加载数据。
PyTorch 支持两种不同类型的数据集:
- 映射式数据集(map-style datasets)
- 可迭代式数据集(iterable-style datasets)
torch.utils.data.Dataset 类
torch.utils.data.Dataset
是 PyTorch 库中的一个标准类,它是 用于自定义数据集的基类。这个类是所有数据集的基础,适用于各种类型的数据加载,包括图像、文本、时间序列等。
-
作用:
Dataset
类的作用是提供一个接口,用于 加载和处理原始数据。它是 PyTorch 的数据加载机制的一部分,通常 与DataLoader
配合使用。 -
主要方法:
__len__()
:返回数据集的大小(即样本的数量)。__getitem__()
:根据索引返回单个数据样本。DataLoader
会使用该方法来迭代数据。
torch.utils.data.Dataset
类 Pytorch 官网文档:
torch.utils.data.Dataset
类是一个抽象类,用于表示一个数据集。
- 所有表示 从键到数据样本映射的数据集 都应当继承此类。
- 所有子类都应当 重写
__getitem__()
方法,用于 根据给定的键获取数据样本。 - 子类还可以选择性地重写
__len__()
方法,许多Sampler
实现和DataLoader
的默认选项都期望返回数据集的大小。 - 子类还可以 选择性地实现
__getitems__()
方法,以加速 批量样本的加载。该方法接受一个包含批次样本索引的列表,并返回一个包含样本的列表。
注意:默认情况下,DataLoader
会构造一个索引采样器,该采样器返回整数索引。为了使其与使用非整数索引/键的映射风格数据集兼容,必须提供自定义的采样器。
# Pytorch torch.utils.data.Dataset 类的源码class Dataset(Generic[_T_co]):r"""An abstract class representing a :class:`Dataset`.All datasets that represent a map from keys to data samples should subclassit. All subclasses should overwrite :meth:`__getitem__`, supporting fetching adata sample for a given key. Subclasses could also optionally overwrite:meth:`__len__`, which is expected to return the size of the dataset by many:class:`~torch.utils.data.Sampler` implementations and the default optionsof :class:`~torch.utils.data.DataLoader`. Subclasses could alsooptionally implement :meth:`__getitems__`, for speedup batched samplesloading. This method accepts list of indices of samples of batch and returnslist of samples... note:::class:`~torch.utils.data.DataLoader` by default constructs an indexsampler that yields integral indices. To make it work with a map-styledataset with non-integral indices/keys, a custom sampler must be provided."""def __getitem__(self, index) -> _T_co:raise NotImplementedError("Subclasses of Dataset should implement __getitem__.")# def __getitems__(self, indices: List) -> List[_T_co]:# Not implemented to prevent false-positives in fetcher check in# torch.utils.data._utils.fetch._MapDatasetFetcherdef __add__(self, other: "Dataset[_T_co]") -> "ConcatDataset[_T_co]":return ConcatDataset([self, other])# No `def __len__(self)` default?# See NOTE [ Lack of Default `__len__` in Python Abstract Base Classes ]# in pytorch/torch/utils/data/sampler.py
torch.utils.data.DataLoader 类
数据加载器(DataLoader)将数据集(dataset)和采样器(sampler)结合起来,并提供对给定数据集的可迭代访问。
DataLoader
支持单进程或多进程加载的 映射式 和 可迭代式 数据集,支持自定义加载顺序、可选的自动批量处理(拼接)以及内存固定(memory pinning)。
这些参数使得 DataLoader
能够在处理数据时非常灵活,支持不同的 数据加载策略、并行处理方式、内存管理 等。通过合理设置这些参数,可以在训练神经网络时实现高效的数据加载和处理。
-
dataset (Dataset) – 从中加载数据的数据集。
-
batch_size (int, 可选) – 每个批次加载多少个样本(默认值:1)。
-
shuffle (bool, 可选) – 设置为
True
时,每个周期(epoch)都会重新打乱数据(默认值:False
)。 -
sampler (Sampler 或 Iterable, 可选) – 定义从数据集中抽取样本的策略。可以是任何实现了
__len__
的 Iterable。如果指定了sampler
,则不能同时指定shuffle
。 -
batch_sampler (Sampler 或 Iterable, 可选) – 类似于
sampler
,但一次返回一个批次的索引。与batch_size
、shuffle
、sampler
和drop_last
互斥。 -
num_workers (int, 可选) – 用于数据加载的子进程数量。设置为 0 时,数据将在主进程中加载。(默认值:0)
-
collate_fn (Callable, 可选) – 将一个样本列表合并为一个 mini-batch 的 Tensor(s)。在使用映射式数据集进行批量加载时使用。
-
pin_memory (bool, 可选) – 如果为
True
,数据加载器将在返回数据之前将 Tensors 复制到设备/CUDA 固定内存中。如果你的数据元素是自定义类型,或者collate_fn
返回的是自定义类型的批次,请参见下面的示例。 -
drop_last (bool, 可选) – 设置为
True
时,如果数据集大小不能被批次大小整除,则丢弃最后一个不完整的批次。如果设置为False
且数据集大小不能被批次大小整除,那么最后一个批次将会更小。(默认值:False
) -
timeout (数值型, 可选) – 如果为正,则表示从工作进程收集批次的超时值。应该始终是非负值。(默认值:0)
-
worker_init_fn (Callable, 可选) – 如果不为
None
,则会在每个工作进程中调用该函数,输入为工作进程的 ID(一个整数,在[0, num_workers - 1]
范围内),在种子设置后、数据加载之前调用。(默认值:None
) -
multiprocessing_context (str 或 multiprocessing.context.BaseContext, 可选) – 如果为
None
,则使用操作系统的默认多进程上下文。(默认值:None
) -
generator (torch.Generator, 可选) – 如果不为
None
,则该随机数生成器将由RandomSampler
用于生成随机索引,并且在多进程中用于生成工作进程的基准种子。(默认值:None
) -
prefetch_factor (int, 可选,仅限关键字参数) – 每个工作进程提前加载的批次数。设置为 2 时,所有工作进程将提前加载总计
2 * num_workers
个批次。(默认值取决于num_workers
设置的值。如果num_workers=0
,默认值为None
;如果num_workers > 0
,默认值为 2) -
persistent_workers (bool, 可选) – 如果为
True
,数据加载器将在数据集被消费一次后不会关闭工作进程。这样可以保持工作进程中的数据集实例处于活动状态。(默认值:False
) -
pin_memory_device (str, 可选) – 如果
pin_memory
为True
,则为内存固定的设备指定设备名称。 -
in_order (bool, 可选) – 如果为
False
,数据加载器将不强制按照先进先出(FIFO)的顺序返回批次。仅在num_workers > 0
时生效。(默认值:True
)
注意:
- 如果使用了
spawn
启动方法,则worker_init_fn
不能是不可序列化的对象,例如 Lambda 函数。有关 PyTorch 中多进程的更多细节,请参阅“多进程最佳实践”。 len(dataloader)
的启发式方法基于所使用的采样器的长度。当数据集是一个IterableDataset
时,它会根据len(dataset) / batch_size
来返回一个估计值,并根据drop_last
设置进行适当的四舍五入,而不管多进程加载配置如何。这是 PyTorch 能做出的 最佳估算,因为 PyTorch 相信用户的数据集代码能够正确处理多进程加载,避免重复数据。
然而,如果数据分片导致多个工作进程的最后一个批次不完整,那么这个估计仍然可能不准确,因为 (1) 一个原本完整的批次可能会被分成多个批次,(2) 当drop_last
设置为True
时,可能会丢失多个批次的样本。不幸的是,PyTorch 通常无法检测到这种情况。
有关这两种数据集类型以及IterableDataset
如何与多进程数据加载交互的更多细节,请参阅“数据集类型”。- 有关随机种子相关的问题,请参阅“可重现性”,“我的数据加载器工作进程返回相同的随机数”以及“多进程数据加载中的随机性”相关说明。
- 将
in_order
设置为False
可能会影响可重现性,并且在数据不平衡的情况下,可能会导致传递给训练器的数据分布偏斜。
自定义数据集示例
1. 自定义 Dataset 类
首先,需要定义一个自定义的 Dataset 类,继承自 torch.utils.data.Dataset
。
# dataset.pyimport torch
from torch.utils.data import Dataset
import os
from PIL import Image
from torchvision import transformsclass CustomDataset(Dataset):def __init__(self, data_dir, mode='train', transform=None):""":param data_dir: 数据集根目录:param mode: 'train' 或 'test',指定加载训练集或测试集:param transform: 数据转换(如图像缩放,裁剪,归一化等)"""self.data_dir = data_dirself.mode = modeself.transform = transform# 假设数据集结构是这样的:# data_dir/# train/# class1/# class2/# test/# class1/# class2/self.image_paths = []self.labels = []# 加载数据self._load_data()def _load_data(self):"""根据模式加载训练集或测试集数据"""# 设置数据目录data_folder = os.path.join(self.data_dir, self.mode)for label, class_name in enumerate(os.listdir(data_folder)):class_folder = os.path.join(data_folder, class_name)if os.path.isdir(class_folder):for img_name in os.listdir(class_folder):img_path = os.path.join(class_folder, img_name)self.image_paths.append(img_path)self.labels.append(label)def __len__(self):"""返回数据集的大小"""return len(self.image_paths)def __getitem__(self, idx):"""根据索引返回数据和标签"""img_path = self.image_paths[idx]label = self.labels[idx]# 读取图像image = Image.open(img_path).convert('RGB')# 应用转换if self.transform:image = self.transform(image)return image, label
在自定义数据集 CustomDataset
中,通过 mode='train'
或 mode='test'
来决定加载训练集或测试集的数据。这个 mode
参数可以在创建数据集时传入:
mode='train'
时,加载训练集的数据。mode='test'
时,加载测试集的数据。
该示例 假设数据集存储在 data_dir/train
和 data_dir/test
文件夹下,并按类存放在子文件夹中。可以根据自己的数据存储结构修改 _load_data()
方法。
2. 在其他 .py 文件中引用和使用该自定义 Dataset
在其他 .py
文件中,可以引用该数据集类,并根据需要加载训练集或测试集。还可以传递数据增强或转换操作,例如使用 torchvision.transforms
来进行图像处理。
# main.pyimport torch
from torch.utils.data import DataLoader
from dataset import CustomDataset
from torchvision import transforms# 定义数据增强和预处理操作
transform = transforms.Compose([transforms.Resize((128, 128)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 创建训练集和测试集
train_dataset = CustomDataset(data_dir='./data', mode='train', transform=transform)
test_dataset = CustomDataset(data_dir='./data', mode='test', transform=transform)# 使用 DataLoader 加载数据集
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 使用训练集
for images, labels in train_loader:print(images.shape, labels.shape) # 输出每个批次的图像和标签的大小# 在此进行训练
torch_geometric.data.Dataset 类
torch_geometric.data.Dataset
类官方文档
在 PyTorch 中,torch.utils.data.Dataset
和 torch_geometric.data.Dataset
都是用来表示数据集的基类,但它们的作用、设计和用途有一些显著的区别,特别是在图神经网络(GNN)方面,
torch.utils.data.Dataset
更 通用,适用于 各种类型的数据集。torch_geometric.data.Dataset
是 专门为处理图数据(如图结构数据、边、节点特征等)而设计的,
torch_geometric.data.Dataset
是 PyTorch Geometric(一个专门为图神经网络设计的扩展库)中的数据集类,继承自 torch.utils.data.Dataset
,专门用于处理图数据,如图结构数据、节点特征 node_features
、边特征 edge_index
等。
-
主要方法:
__len__()
:返回数据集中的图的数量。get()
:返回单个图的数据。get()
通常是实现单个数据项的加载过程,返回一个Data
对象,其中包含图的结构信息(如edge_index
)、节点特征(如x
)等。
-
用途:专门用于图神经网络(GNN)任务,适合处理图结构数据,例如社交网络、分子结构、物理网络等。
torch_geometric.data.Dataset VS torch.utils.data.Dataset
主要区别:
特性 | torch.utils.data.Dataset | torch_geometric.data.Dataset |
---|---|---|
设计目的 | 用于处理一般的数据集(如图像、文本、时间序列等)。 | 专门为图神经网络设计,处理图结构数据(如图、边、节点特征)。 |
继承关系 | 基本类,PyTorch 数据加载的基类。 | 继承自 torch.utils.data.Dataset ,扩展为图数据处理。 |
数据存储 | 存储一般的数据(如图像、文本数据等)。 | 存储图数据结构,包括 edge_index 、x (节点特征)等。 |
核心方法 | __getitem__() 返回单个数据项,通常是一个样本。 | get() 返回一个图数据对象,通常是 Data 。 |
数据类型 | 适用于任何类型的数据集。 | 适用于图结构数据集。 |
多进程支持 | 支持多进程数据加载(通过 num_workers )。 | 同样支持多进程数据加载,但主要针对图数据。 |
批处理支持 | 支持自动批处理(batching),使用 DataLoader 。 | 也支持批处理,并且能够自动处理图结构的数据。 |
图数据处理 | 没有内建的图数据处理支持。 | 内建支持图数据结构,如 edge_index 、x (节点特征)、y (标签)。 |
关系:
torch_geometric.data.Dataset
是torch.utils.data.Dataset
的一个扩展,专门为图数据设计。torch_geometric.data.Dataset
在其基础上提供了对图数据的支持,包括图的边结构、节点特征等,使得 PyTorch Geometric 更适用于 图神经网络(GNN) 等图学习任务。
相关文章:

【Pytorch 库】自定义数据集相关的类
torch.utils.data.Dataset 类torch.utils.data.DataLoader 类自定义数据集示例1. 自定义 Dataset 类2. 在其他 .py 文件中引用和使用该自定义 Dataset torch_geometric.data.Dataset 类torch_geometric.data.Dataset VS torch.utils.data.Dataset 详细信息,参阅 tor…...

electron打包基本教程
从0开始搭建 概要步骤基础软件运行项目打包项目 注意事项 概要 将html打包成桌面的主流有electron和nwjs,nwjs更加简单,但是使用效果不如electron,electron打包比较麻烦,但是效果比较好,反正各有优势和缺点 步骤 基…...

实现pytorch注意力机制-one demo
主要组成部分: 1. 定义注意力层: 定义一个Attention_Layer类,接受两个参数:hidden_dim(隐藏层维度)和is_bi_rnn(是否是双向RNN)。 2. 定义前向传播: 定义了注意力层的…...
深入Flask:如何优雅地处理HTTP请求与响应
哈喽,大家好,我是木头左! 本文将带你深入了解如何在Flask中优雅地处理HTTP请求和响应,让你的应用更加高效、安全和用户友好。 创建一个简单的Flask应用 让从创建一个最简单的Flask应用开始: from flask import Flaskapp = Flask(__name__)@app.route(/) def...

JVM ②-双亲委派模型 || 垃圾回收GC
这里是Themberfue 在上节课对内存区域划分以及类加载的过程有了简单的了解后,我们再了解其他两个较为重要的机制,这些都是面试中常考的知识点,有必要的话建议背出来,当然不是死记硬背,而是要有理解的背~~~如果对 JVM …...
jQuery介绍(快速、简洁JavaScript库,诞生于2006年,主要目标是简化HTML文档操作、事件处理、动画和Ajax交互)
文章目录 **核心功能 & 亮点**1. **简化 DOM 操作**2. **链式调用**3. **跨浏览器兼容**4. **便捷的事件绑定**5. **Ajax 封装**6. **动画效果** **现状与适用场景**- **传统项目维护**:许多旧系统(如 WordPress 插件、老企业网站)仍依赖…...

python旅游推荐系统+爬虫+可视化(协同过滤算法)
✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术,以实现从网站抓取旅游数据、个性化推荐和直观展…...

Ubuntu 22.04.5 LTS 安装企业微信,(2025-02-17安装可行)
一、依赖包(Ubuntu 20.04/Debian 11) 点击下载https://www.spark-app.store/download_dependencies_latest 1、 下载最新的依赖包。 请访问星火应用商店依赖包下载页面, 下载最新的依赖包。2、解压依赖包 </...
【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认
方法一:自定义格式 选中需要设置格式的单元格区域。右键选择设置单元格格式,或者在工具栏中选择开始 -> 数字 -> 自定义格式。在类型框中输入以下自定义格式: [>1000]0;[>100]0.0;G/通用格式解释: [>1000]0&…...

UDP与TCP
用UDP一定比用TCP快吗? 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。 对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到,就像打电话一样,只要“喂喂"两下对方就能回你个…...

Web开发技术概述
Web开发技术涵盖了前端和后端开发,以及数据库技术。前端开发包括使用HTML、CSS、JavaScript等原生技术,以及jQuery、Bootstrap、AngularJS、React、Vue等框架。后端开发则涉及ASP.NET、PHP、Python Web(Flask、Django)、Java Web&…...

解压rar格式的软件有哪些?8种方法(Win/Mac/手机/网页端)
RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而…...

uniapp开发:首次进入 App 弹出隐私协议窗口
前言:在移动应用开发中,隐私协议弹窗是一个非常重要的功能。它不仅符合法律法规的要求(如 GDPR、CCPA 等),还能增强用户对 App 的信任感。本文将介绍如何在 Uniapp 开发的 App 中实现“首次进入弹出隐私协议窗口&#…...

执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案
vite搭建的vue项目,使用pnpm包管理工具,执行pnpm run dev,报如下错误: 报错原因: pnpm依赖安装不完整,缺少esbuild.exe文件,导致无法执行启动命令。 解决方案: 根据错误提示中提到…...
OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分,它提供了实现 k-近邻算法(k-Nearest Neighbors, KNN)的…...

JVM中的线程池详解:原理→实践
一、为什么需要线程池? 在多线程编程中,频繁地创建和销毁线程会带来显著的性能开销。 想象一下,如果你经营一家西餐厅,每次有顾客到来你都雇佣新的服务员,顾客吃完结账后就解雇——这种模式是不是非常效率低下且成本高…...

SNARKs 和 UTXO链的未来
1. 引言 SNARKs 经常被视为“解决”扩容问题的灵丹妙药。虽然 SNARKs 可以提供令人难以置信的好处,但也需要承认其局限性——SNARKs 无法解决区块链目前面临的现有带宽限制。 本文旨在通过对 SNARKs 对比特币能做什么和不能做什么进行(相对)…...
JavaScript设计模式 -- 外观模式
在实际开发中,往往会遇到多个子系统协同工作时,直接操作各个子系统不仅接口繁琐,还容易导致客户端与内部实现紧密耦合。**外观模式(Facade Pattern)**通过为多个子系统提供一个统一的高层接口,将复杂性隐藏…...

百达翡丽(Patek Philippe):瑞士制表的巅峰之作(中英双语)
百达翡丽(Patek Philippe):瑞士制表的巅峰之作 在钟表界,百达翡丽(Patek Philippe) 一直被誉为“世界三大名表”之一,并且常被认为是其中的至高存在。一句“没人能真正拥有一枚百达翡丽&#x…...

阿里云一键部署DeepSeek-V3、DeepSeek-R1模型
目录 支持的模型列表 模型部署 模型调用 WebUI使用 在线调试 API调用 关于成本 FAQ 点击部署后服务长时间等待 服务部署成功后,调用API返回404 请求太长导致EAS网关超时 部署完成后,如何在EAS的在线调试页面调试 模型部署之后没有“联网搜索…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...