通用工具类与异常处理:Python实用指南

news2024/12/28 6:59:57

通用工具类与异常处理:Python实用指南

        • 1. 通用异常类:`ValidationException`
        • 2. 通用工具类:`Utils`
        • 3. 示例文件内容
          • `default_config.yaml`
          • `config.yaml`
          • `data.jsonl`
        • 4. 代码示例
        • 5. 运行结果
        • 6. 完整代码
        • 7. 总结

在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键。本文将介绍如何将特定的异常类GlueValidaionException改写为更通用的ValidationException,并创建一个通用的工具类Utils,包含常用的文件操作和数据处理方法。最后,我们将通过代码示例展示如何使用这些工具。


1. 通用异常类:ValidationException

首先,我们将GlueValidaionException改写为更通用的ValidationException,使其适用于各种验证场景。

class ValidationException(Exception):
    """
    通用验证异常类,适用于各种验证场景。
    """
    def __init__(self, err_message, excep_obj):
        message = ("[Invalid input detected]\n"
                   f"Exception: {err_message}\n"
                   f"Exception logs: {excep_obj}")
        super().__init__(message)

2. 通用工具类:Utils

接下来,我们创建一个通用的工具类Utils,包含常用的文件操作和数据处理方法。

import json
from os.path import join
from typing import Dict, List
import yaml

class Utils:
    @staticmethod
    def yaml_to_dict(file_path: str) -> Dict:
        """
        将YAML文件转换为字典。
        
        :param file_path: YAML文件路径
        :return: 解析后的字典
        """
        with open(file_path) as yaml_file:
            yaml_string = yaml_file.read()
            try:
                parsed_dict = yaml.safe_load(yaml_string)
            except yaml.scanner.ScannerError as e:
                raise ValidationException(f"YAML文件语法错误: {file_path}", e)
        return parsed_dict

    @staticmethod
    def yaml_to_class(yaml_file_path: str, cls: type, default_yaml_file_path: str = None):
        """
        将YAML文件转换为类对象。
        
        :param yaml_file_path: YAML文件路径
        :param cls: 目标类
        :param default_yaml_file_path: 默认YAML文件路径
        :return: 类对象
        """
        if not yaml_file_path:
            yaml_file_path = default_yaml_file_path
        custom_args = Utils.yaml_to_dict(yaml_file_path)

        if default_yaml_file_path:
            default_args = Utils.yaml_to_dict(default_yaml_file_path)
            missing_args = set(default_args) - set(custom_args)
            for key in list(missing_args):
                custom_args[key] = default_args[key]

        try:
            yaml_as_class = cls(**custom_args)
        except TypeError as e:
            raise ValidationException(f"YAML文件转换为类失败: {yaml_file_path}", e)

        return yaml_as_class

    @staticmethod
    def read_jsonl(file_path: str) -> List:
        """
        读取JSONL文件并返回所有JSON对象列表。
        
        :param file_path: JSONL文件路径
        :return: JSON对象列表
        """
        jsonl_list = []
        with open(file_path, "r") as fileobj:
            while True:
                single_row = fileobj.readline()
                if not single_row:
                    break
                json_object = json.loads(single_row.strip())
                jsonl_list.append(json_object)
        return jsonl_list

    @staticmethod
    def read_jsonl_row(file_path: str):
        """
        逐行读取JSONL文件并返回JSON对象。
        
        :param file_path: JSONL文件路径
        :return: JSON对象生成器
        """
        with open(file_path, "r") as fileobj:
            while True:
                try:
                    single_row = fileobj.readline()
                    if not single_row:
                        break
                    json_object = json.loads(single_row.strip())
                    yield json_object
                except json.JSONDecodeError as e:
                    print(f"JSONL文件读取错误: {file_path}. 错误: {e}")
                    continue

    @staticmethod
    def append_as_jsonl(file_path: str, args_to_log: Dict):
        """
        将字典追加到JSONL文件中。
        
        :param file_path: JSONL文件路径
        :param args_to_log: 要追加的字典
        """
        json_str = json.dumps(args_to_log, default=str)
        with open(file_path, "a") as fileobj:
            fileobj.write(json_str + "\n")

    @staticmethod
    def save_jsonlist(file_path: str, json_list: List, mode: str = "a"):
        """
        将JSON对象列表保存到JSONL文件中。
        
        :param file_path: JSONL文件路径
        :param json_list: JSON对象列表
        :param mode: 文件写入模式
        """
        with open(file_path, mode) as file_obj:
            for json_obj in json_list:
                json_str = json.dumps(json_obj, default=str)
                file_obj.write(json_str + "\n")

    @staticmethod
    def str_list_to_dir_path(str_list: List[str]) -> str:
        """
        将字符串列表拼接为目录路径。
        
        :param str_list: 字符串列表
        :return: 拼接后的目录路径
        """
        if not str_list:
            return ""
        path = ""
        for dir_name in str_list:
            path = join(path, dir_name)
        return path

3. 示例文件内容

以下是示例文件的内容,包括default_config.yamlconfig.yamldata.jsonl

default_config.yaml
name: "default_name"
value: 100
description: "This is a default configuration."
config.yaml
name: "custom_name"
value: 200
data.jsonl
{"id": 1, "name": "Alice", "age": 25}
{"id": 2, "name": "Bob", "age": 30}
{"id": 3, "name": "Charlie", "age": 35}

4. 代码示例

以下是如何使用Utils工具类的示例:

# 示例类
class Config:
    def __init__(self, name, value, description=None):
        self.name = name
        self.value = value
        self.description = description

# 示例1: 将YAML文件转换为字典
yaml_dict = Utils.yaml_to_dict("config.yaml")
print("YAML文件转换为字典:", yaml_dict)

# 示例2: 将YAML文件转换为类对象
config_obj = Utils.yaml_to_class("config.yaml", Config, "default_config.yaml")
print("YAML文件转换为类对象:", config_obj.name, config_obj.value, config_obj.description)

# 示例3: 读取JSONL文件
jsonl_list = Utils.read_jsonl("data.jsonl")
print("读取JSONL文件:", jsonl_list)

# 示例4: 逐行读取JSONL文件
print("逐行读取JSONL文件:")
for json_obj in Utils.read_jsonl_row("data.jsonl"):
    print(json_obj)

# 示例5: 将字典追加到JSONL文件
Utils.append_as_jsonl("data.jsonl", {"id": 4, "name": "David", "age": 40})
print("追加数据到JSONL文件完成")

# 示例6: 将JSON对象列表保存到JSONL文件
Utils.save_jsonlist("data.jsonl", [{"id": 5, "name": "Eve", "age": 45}])
print("保存JSON列表到JSONL文件完成")

# 示例7: 将字符串列表拼接为目录路径
path = Utils.str_list_to_dir_path(["dir1", "dir2", "dir3"])
print("拼接目录路径:", path)

5. 运行结果

运行上述代码后,输出结果如下:

YAML文件转换为字典: {'name': 'custom_name', 'value': 200}
YAML文件转换为类对象: custom_name 200 This is a default configuration.
读取JSONL文件: [{'id': 1, 'name': 'Alice', 'age': 25}, {'id': 2, 'name': 'Bob', 'age': 30}, {'id': 3, 'name': 'Charlie', 'age': 35}]
逐行读取JSONL文件:
{'id': 1, 'name': 'Alice', 'age': 25}
{'id': 2, 'name': 'Bob', 'age': 30}
{'id': 3, 'name': 'Charlie', 'age': 35}
追加数据到JSONL文件完成
保存JSON列表到JSONL文件完成
拼接目录路径: dir1/dir2/dir3

6. 完整代码
import json
from os.path import join
from typing import Dict, List

import yaml
from yaml.scanner import ScannerError


class ValidationException(Exception):
    """
    通用验证异常类,适用于各种验证场景。
    """

    def __init__(self, err_message, excep_obj):
        message = ("[Invalid input detected]\n"
                   f"Exception: {err_message}\n"
                   f"Exception logs: {excep_obj}")
        super().__init__(message)


class Utils:
    @staticmethod
    def yaml_to_dict(file_path: str) -> Dict:
        """
        将YAML文件转换为字典。

        :param file_path: YAML文件路径
        :return: 解析后的字典
        """
        with open(file_path) as yaml_file:
            yaml_string = yaml_file.read()
            try:
                parsed_dict = yaml.safe_load(yaml_string)
            except ScannerError as e:
                raise ValidationException(f"YAML文件语法错误: {file_path}", e)
        return parsed_dict

    @staticmethod
    def yaml_to_class(yaml_file_path: str, cls: type, default_yaml_file_path: str = None):
        """
        将YAML文件转换为类对象。

        :param yaml_file_path: YAML文件路径
        :param cls: 目标类
        :param default_yaml_file_path: 默认YAML文件路径
        :return: 类对象
        """
        if not yaml_file_path:
            yaml_file_path = default_yaml_file_path
        custom_args = Utils.yaml_to_dict(yaml_file_path)

        if default_yaml_file_path:
            default_args = Utils.yaml_to_dict(default_yaml_file_path)
            missing_args = set(default_args) - set(custom_args)
            for key in list(missing_args):
                custom_args[key] = default_args[key]

        try:
            yaml_as_class = cls(**custom_args)
        except TypeError as e:
            raise ValidationException(f"YAML文件转换为类失败: {yaml_file_path}", e)

        return yaml_as_class

    @staticmethod
    def read_jsonl(file_path: str) -> List:
        """
        读取JSONL文件并返回所有JSON对象列表。

        :param file_path: JSONL文件路径
        :return: JSON对象列表
        """
        jsonl_list = []
        with open(file_path, "r") as file_obj:
            while True:
                single_row = file_obj.readline()
                if not single_row:
                    break
                json_obj = json.loads(single_row.strip())
                jsonl_list.append(json_obj)
        return jsonl_list

    @staticmethod
    def read_jsonl_row(file_path: str):
        """
        逐行读取JSONL文件并返回JSON对象。

        :param file_path: JSONL文件路径
        :return: JSON对象生成器
        """
        with open(file_path, "r") as file_object:
            while True:
                try:
                    single_row = file_object.readline()
                    if not single_row:
                        break
                    json_obj = json.loads(single_row.strip())
                    yield json_obj
                except json.JSONDecodeError as e:
                    print(f"JSONL文件读取错误: {file_path}. 错误: {e}")
                    continue

    @staticmethod
    def append_as_jsonl(file_path: str, args_to_log: Dict):
        """
        将字典追加到JSONL文件中。

        :param file_path: JSONL文件路径
        :param args_to_log: 要追加的字典
        """
        json_str = json.dumps(args_to_log, default=str)
        with open(file_path, "a") as file_object:
            file_object.write(json_str + "\n")

    @staticmethod
    def save_jsonlist(file_path: str, json_list: List, mode: str = "a"):
        """
        将JSON对象列表保存到JSONL文件中。

        :param file_path: JSONL文件路径
        :param json_list: JSON对象列表
        :param mode: 文件写入模式
        """
        with open(file_path, mode) as file_obj:
            for json_obj in json_list:
                json_str = json.dumps(json_obj, default=str)
                file_obj.write(json_str + "\n")

    @staticmethod
    def str_list_to_dir_path(str_list: List[str]) -> str:
        """
        将字符串列表拼接为目录路径。

        :param str_list: 字符串列表
        :return: 拼接后的目录路径
        """
        if not str_list:
            return ""
        dir_path = ""
        for dir_name in str_list:
            dir_path = join(dir_path, dir_name)
        return dir_path


# 示例类
class Config:
    def __init__(self, name, value, description=None):
        self.name = name
        self.value = value
        self.description = description


# 示例1: 将YAML文件转换为字典
yaml_dict = Utils.yaml_to_dict("config.yaml")
print("YAML文件转换为字典:", yaml_dict)

# 示例2: 将YAML文件转换为类对象
config_obj = Utils.yaml_to_class("config.yaml", Config, "default_config.yaml")
print("YAML文件转换为类对象:", config_obj.name, config_obj.value, config_obj.description)

# 示例3: 读取JSONL文件
jsonl_list = Utils.read_jsonl("data.jsonl")
print("读取JSONL文件:", jsonl_list)

# 示例4: 逐行读取JSONL文件
print("逐行读取JSONL文件:")
for json_obj in Utils.read_jsonl_row("data.jsonl"):
    print(json_obj)

# 示例5: 将字典追加到JSONL文件
Utils.append_as_jsonl("data.jsonl", {"id": 4, "name": "David", "age": 40})
print("追加数据到JSONL文件完成")

# 示例6: 将JSON对象列表保存到JSONL文件
Utils.save_jsonlist("data.jsonl", [{"id": 5, "name": "Eve", "age": 45}])
print("保存JSON列表到JSONL文件完成")

# 示例7: 将字符串列表拼接为目录路径
path = Utils.str_list_to_dir_path(["dir1", "dir2", "dir3"])
print("拼接目录路径:", path)

7. 总结

通过将特定的异常类改写为通用的ValidationException,并创建一个包含常用方法的Utils工具类,我们可以大大提高代码的复用性和可维护性。本文提供的代码示例展示了如何使用这些工具类进行文件操作和数据处理,适合初级Python程序员学习和参考。

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

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

相关文章

VMwareTools安装(ubuntu23)

1.打开VMware,菜单栏虚拟机->安装VMwareTools 2.点开光驱,把压缩包复制到桌面 3.解压 如何开启sudo权限: sudo passwd root 之后输入密码查看解压文件夹,执行vmware-install.pl文件 安装过程中碰见如下报错信息:…

jangow-01-1.0.1靶机

靶机 ip:192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式,我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个,按回车。 继续选择第二个,这次按 e 进入编辑页面 接下来,…

C# GDI+数码管数字控件

调用方法 int zhi 15;private void button1_Click(object sender, EventArgs e){if (zhi > 19){zhi 0;}lcdDisplayControl1.DisplayText zhi.ToString();} 运行效果 控件代码 using System; using System.Collections.Generic; using System.Drawing.Drawing2D; using …

Cilium:BPF 和 XDP 参考指南(2021)

大家觉得有意义和帮助记得及时关注和点赞!!! BPF 是 Linux 内核中一个非常灵活与高效的类虚拟机(virtual machine-like)组件, 能够在许多内核 hook 点安全地执行字节码(bytecode )。很多 内核子系统都已经使用了 BPF&a…

LabVIEW条件配置对话框

条件配置对话框(Configure Condition Dialog Box) 要求:Base Development System 当右键单击**条件禁用结构(Conditional Disable Structure)**并选择以下选项时,会显示此对话框: Add Subdiagr…

机器学习-高斯混合模型

文章目录 高斯混合模型对无标签的数据集:使用高斯混合模型进行聚类对有标签的数据集:使用高斯混合模型进行分类总结 高斯混合模型 对无标签的数据集:使用高斯混合模型进行聚类 对有标签的数据集:使用高斯混合模型进行分类 总结

GitLab 服务变更提醒:中国大陆、澳门和香港用户停止提供服务(GitLab 服务停止)

目录 前言 一. 变更详情 1. 停止服务区域 2. 邮件通知 3. 新的服务提供商 4. 关键日期 5. 行动建议 二. 迁移指南 三. 注意事项 四. 相关推荐 前言 近期,许多位于中国大陆、澳门和香港的 GitLab 用户收到了一封来自 GitLab 官方的重要通知。根据这封邮件…

MacOS下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具, 下面介绍MacOS私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业,支持在本地或专属服务器上运行,以实现对数据和系统的完全控制。 1、Mac 服务端安装 Mac安装包下载地址&a…

css绘制圆并绘制圆的半径

<div class"item1"></div>.item1 {position: relative;width: 420px;height: 420px;border-radius: 50%; /* 圆形 */color: white; /* 文本颜色 */background-color: rgba(154, 227, 36, 0.4); } .item1::before {content: "";position: absol…

【原理图专题】CIS库中有两部分组成的器件怎么查看符号库

在ICS库使用过程中&#xff0c;会遇到比如运放、MOS管等是由两个符号构成的一个器件。比如下图所示的器件&#xff1a; 为了方便我们知道内部结构&#xff0c;很可能把器件拆成两部分&#xff0c;一部分是PMOS&#xff0c;一部分是NMOS。包括大的MCU或芯片也是这样&#xff0c;…

HarmonyOS NEXT 实战之元服务:静态案例效果---查看国内航班服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index代码 import { authen…

ID读卡器TCP协议Delphi7小程序开发

Delphi 7是一款功能强大的快速应用程序开发工具&#xff0c;它提供了丰富的开发环境和组件库&#xff0c;支持多种操作系统和数据库连接&#xff0c;方便开发者进行高效的程序设计。然而&#xff0c;由于它是一款较旧的开发环境&#xff0c;在使用时需要注意兼容性和安全问题。…

C# 窗体应用程序嵌套web网页(基于谷歌浏览器内核)

有一个winform项目&#xff0c;需要借助一个web项目来显示&#xff0c;并且对web做一些操作,web页目是需要用谷歌内核&#xff0c;基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步&#xff1a;右键项目&#xff0c;点击 管理NuGet程序包 , 输…

SRA Toolkit简单使用(prefetch和fastq-dump)

工具下载网址&#xff1a; 01. 下载 SRA Toolkit ncbi/sra-tools 维基https://github.com/ncbi/sra-tools/wiki/01.-Downloading-SRA-Toolkit 我下载的是linux 3.0.10版&#xff0c;目前最新版如下&#xff1a;https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/3.1.1/sratoolkit.3…

Spring Boot介绍、入门案例、环境准备、POM文件解读

文章目录 1.Spring Boot(脚手架)2.微服务3.环境准备3.1创建SpringBoot项目3.2导入SpringBoot相关依赖3.3编写一个主程序&#xff1b;启动Spring Boot应用3.4编写相关的Controller、Service3.5运行主程序测试3.6简化部署 4.Hello World探究4.1POM文件4.1.1父项目4.1.2父项目的父…

【开源框架】从零到一:AutoGen Studio开源框架-UI层环境安装与智能体操作全攻略

一、什么是AutoGen AutoGen是微软推出的一款工具&#xff0c;旨在帮助开发者轻松创建基于大语言模型的复杂应用程序。在传统上&#xff0c;开发者需要具备设计、实施和优化工作流程的专业知识&#xff0c;而AutoGen则通过自动化这些流程&#xff0c;简化了搭建和优化的过程。 …

【论文阅读】MedCLIP: Contrastive Learning from Unpaired Medical Images and Text

【论文阅读】MedCLIP: Contrastive Learning from Unpaired Medical Images and Text 1.论文背景与动机2.MedCLIP的贡献3.提出的方法4.构建语义相似矩阵的过程5. 实验6. 结论与局限性 论文地址&#xff1a; pdf github地址&#xff1a;项目地址 Zifeng Wang, Zhenbang Wu, Di…

雷电模拟器安装Lxposed

雷电模拟器最新版支持Lxposed。记录一下安装过程 首先到官网下载并安装最新版&#xff0c;我安装的时候最新版是9.1.34.0&#xff0c;64位 然后开启root和系统文件读写 然后下载magisk-delta-6并安装 ,这个是吾爱破解论坛提供的&#xff0c;号称适配安卓7以上所有机型&#x…

全解:Redis RDB持久化和AOF持久化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

VMware虚拟机安装银河麒麟操作系统KylinOS教程(超详细)

目录 引言1. 下载2. 安装 VMware2. 安装银河麒麟操作系统2.1 新建虚拟机2.2 安装操作系统2.3 网络配置 3. 安装VMTools 创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄袭…