详解Python中通用工具类与异常处理

2024-12-29 03:50

本文主要是介绍详解Python中通用工具类与异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx...

python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键www.chinasem.cn。本文将介绍如何将特定的异常类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_paphpth: 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 =php 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.yaml、config.yaml和data.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.phpname, 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文件路径
        :returPkmfuFZYn: 类对象
        """
        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程序员学习和参考。

到此这篇关于详解Python中通用工具类与异常处理的文章就介绍到这了,更多相关Python通用工具类与异常处理内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于详解Python中通用工具类与异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152830

相关文章

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错