py默认框架和代码

news2025/4/23 11:45:46

py默认框架

平常工作日常需要频繁写python脚本,留下一个常用的模板

# template.py
import logging
import json
import time
import functools
import os
from typing import Any, Dict, Optional, Union
from pathlib import Path
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from concurrent.futures import ThreadPoolExecutor
from threading import Lock
from datetime import datetime

# =============== 日志配置部分 ===============
def setup_logger(log_level=logging.INFO, max_size_mb=50, backup_count=5):
    """
    配置全局日志接口
    
    参数:
        log_level: 日志级别,默认为INFO
        max_size_mb: 单个日志文件最大大小(MB),默认50MB
        backup_count: 备份文件数量,默认5个
    """
    # 创建logs目录
    log_dir = Path("logs")
    if not log_dir.exists():
        log_dir.mkdir(parents=True, exist_ok=True)
    
    # 基本日志文件名
    log_file = log_dir / "app.log"
    
    # 配置日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 使用TimedRotatingFileHandler按天滚动 + RotatingFileHandler按大小滚动
    # 大小限制handler
    size_handler = RotatingFileHandler(
        filename=log_file,
        maxBytes=max_size_mb * 1024 * 1024,  # 转换MB为字节
        backupCount=backup_count,
        encoding='utf-8'
    )
    size_handler.setFormatter(formatter)
    
    # 时间滚动handler
    time_handler = TimedRotatingFileHandler(
        filename=log_file,
        when='midnight',  # 每天午夜滚动
        interval=1,       # 间隔为1天
        backupCount=backup_count,
        encoding='utf-8'
    )
    time_handler.setFormatter(formatter)
    time_handler.suffix = "%Y%m%d"  # 设置日志文件后缀格式
    
    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    
    # 获取根日志器并配置
    logger = logging.getLogger()
    logger.setLevel(log_level)
    
    # 清除现有处理器,避免重复
    if logger.handlers:
        logger.handlers.clear()
        
    logger.addHandler(size_handler)
    logger.addHandler(time_handler)
    logger.addHandler(console_handler)
    
    logger.info("日志系统初始化完成 - 按日滚动及大小限制(最大:%dMB)", max_size_mb)
    return logger

# =============== 配置管理 ===============
class ConfigManager:
    _instance = None
    _lock = Lock()
    _config: Dict[str, Any] = {}
    
    def __new__(cls):
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
            return cls._instance
    
    @classmethod
    def load_config(cls, config_path: Union[str, Path]) -> None:
        """加载配置文件"""
        try:
            with open(config_path, 'r', encoding='utf-8') as f:
                cls._config = json.load(f)
        except Exception as e:
            logger.error(f"加载配置文件失败: {e}")
            raise
    
    @classmethod
    def get(cls, key: str, default: Any = None) -> Any:
        """获取配置值"""
        return cls._config.get(key, default)
    
    @classmethod
    def set(cls, key: str, value: Any) -> None:
        """设置配置值"""
        cls._config[key] = value

# =============== 性能计时器装饰器 ===============
def timer(func):
    """函数执行时间计时器装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        logger.debug(f"{func.__name__} 执行时间: {end_time - start_time:.3f}秒")
        return result
    return wrapper

# =============== 缓存装饰器 ===============
def cache(ttl: int = 300):  # 默认缓存5分钟
    """
    函数结果缓存装饰器
    
    参数:
        ttl: 缓存生存时间(秒)
    """
    def decorator(func):
        cache_data = {}
        cache_times = {}
        
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            key = str((args, sorted(kwargs.items())))
            current_time = time.time()
            
            # 检查缓存是否存在且未过期
            if key in cache_data and current_time - cache_times[key] < ttl:
                return cache_data[key]
            
            # 计算新结果
            result = func(*args, **kwargs)
            cache_data[key] = result
            cache_times[key] = current_time
            return result
        return wrapper
    return decorator

# =============== 异常处理 ===============
class AppError(Exception):
    """应用基础异常类"""
    def __init__(self, message: str, error_code: str = None):
        self.message = message
        self.error_code = error_code
        super().__init__(self.message)

def handle_exception(func):
    """统一异常处理装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except AppError as e:
            logger.error(f"业务异常: {e.message}, 错误码: {e.error_code}")
            raise
        except Exception as e:
            logger.exception("未预期的异常:")
            raise AppError(f"系统错误: {str(e)}", "SYS_ERROR")
    return wrapper

# =============== 线程池管理 ===============
class ThreadPoolManager:
    _instance = None
    _lock = Lock()
    
    def __new__(cls):
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
                cls._instance.pool = ThreadPoolExecutor(max_workers=os.cpu_count() * 2)
            return cls._instance
    
    def submit(self, fn, *args, **kwargs):
        """提交任务到线程池"""
        return self.pool.submit(fn, *args, **kwargs)

# =============== 文件操作工具 ===============
class FileUtil:
    @staticmethod
    def ensure_dir(directory: Union[str, Path]) -> Path:
        """确保目录存在,如果不存在则创建"""
        path = Path(directory)
        path.mkdir(parents=True, exist_ok=True)
        return path
    
    @staticmethod
    @handle_exception
    def safe_read_json(file_path: Union[str, Path]) -> Dict:
        """安全读取JSON文件"""
        with open(file_path, 'r', encoding='utf-8') as f:
            return json.load(f)
    
    @staticmethod
    @handle_exception
    def safe_write_json(data: Dict, file_path: Union[str, Path]) -> None:
        """安全写入JSON文件"""
        with open(file_path, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)

# =============== 示例使用 ===============
@timer
@cache(ttl=60)
@handle_exception
def example_function(x: int) -> int:
    """示例函数:展示装饰器的使用"""
    time.sleep(1)  # 模拟耗时操作
    if x < 0:
        raise AppError("输入值不能为负数", "INVALID_INPUT")
    return x * 2

if __name__ == "__main__":
    # 初始化日志
    logger = setup_logger()
    
    # 配置管理示例
    config = ConfigManager()
    config.set("app_name", "最佳实践示例")
    
    # 线程池示例
    pool = ThreadPoolManager()
    
    try:
        # 测试示例函数
        result = example_function(10)
        logger.info(f"计算结果: {result}")
        
        # 测试文件操作
        data = {"test": "数据"}
        FileUtil.ensure_dir("data")
        FileUtil.safe_write_json(data, "data/test.json")
        
    except AppError as e:
        logger.error(f"应用错误: {e.message}")
    except Exception as e:
        logger.exception("未知错误:")

单元测试:
可以直接使用ai生成

import unittest
from zz_test import my_fn

# my_fn.py
###
def my_fn():
    return 0
###


class TestMyFunction(unittest.TestCase):
    def test_my_fn_returns_zero(self):
        """测试my_fn函数是否返回0"""
        result = my_fn()
        self.assertEqual(result, 0)
    
    def test_my_fn_returns_integer(self):
        """测试my_fn函数返回值类型是否为整数"""
        result = my_fn()
        self.assertIsInstance(result, int)

if __name__ == '__main__':
    unittest.main() 

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

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

相关文章

k8s-1.28.10 安装metrics-server

1.简介 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标&#xff0c;通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 2.下载yaml文件 wget https:/…

基于外部中中断机制,实现以下功能: 1.按键1,按下和释放后,点亮LED 2.按键2,按下和释放后,熄灭LED 3.按键3,按下和释放后,使得LED闪烁

题目&#xff1a; 参照外部中断的原理和代码示例,再结合之前已经实现的按键切换LED状态的实验&#xff0c;用外部中断改进其实现。 请自行参考文档《中断》当中&#xff0c;有关按键切换LED状态的内容, 自行连接电路图&#xff0c;基于外部中断机制&#xff0c;实现以下功能&am…

【我的创作纪念日】 --- 与CSDN走过的第365天

个人主页&#xff1a;夜晚中的人海 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。-《荀子》 文章目录 &#x1f389;一、机缘&#x1f680;二、收获&#x1f3a1;三、 日常⭐四、成就&#x1f3e0;五、憧憬 &#x1f389;一、机缘 光阴似箭&am…

鸿蒙生态新利器:华为ArkUI-X混合开发框架深度解析

鸿蒙生态新利器&#xff1a;华为ArkUI-X混合开发框架深度解析 作者&#xff1a;王老汉 | 鸿蒙生态开发者 | 2025年4月 &#x1f4e2; 前言&#xff1a;开发者们的新机遇 各位鸿蒙开发者朋友们&#xff0c;是否还在为多平台开发重复造轮子而苦恼&#xff1f;今天给大家介绍一位…

‌信号调制与解调技术基础解析

调制解调技术是通信系统中实现基带信号与高频载波信号相互转换的主要技术&#xff0c;通过调整信号特性使其适应不同信道环境&#xff0c;保障信息传输的效率和可靠性。 调制与解调的基本概念 调制&#xff08;Modulation&#xff09;‌ 将低频基带信号&#xff08;如语音或数…

【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细

批量识别扫描件PDF指定区域内容并重命名文件方案 应用场景 本方案适用于以下场景: 企业档案数字化管理:批量处理扫描的合同、发票等文件,按内容自动分类命名财务票据处理:自动识别票据上的关键信息(如发票号码、日期)用于归档医疗记录管理:从扫描的检查报告中提取患者I…

序列决策问题(Sequential Decision-Making Problem)

序列决策问题&#xff08;Sequential Decision-Making Problem&#xff09;是强化学习&#xff08;Reinforcement Learning, RL&#xff09;的核心研究内容&#xff0c;其核心思想是&#xff1a;​​智能体&#xff08;Agent&#xff09;需要在连续的时间步骤中&#xff0c;通过…

L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制

一、为什么需要 Prompt 模板&#xff1f; 在与 AI 模型交互时&#xff0c;我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题&#xff0c;通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在&#xff1a; 固定输出格式&am…

LLM中什么是模板定义、提示工程和文档处理链

LLM中什么是模板定义、提示工程和文档处理链 定义提示模板(prompt_template):prompt_template = """Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make…

密码学(二)流密码

2.1流密码的基本概念 流密码的基本思想是利用密钥 k 产生一个密钥流...&#xff0c;并使用如下规则对明文串 ... 加密&#xff1a;。密钥流由密钥流发生器产生&#xff1a; &#xff0c;这里是加密器中的记忆元件&#xff08;存储器&#xff09;在时刻 i 的状态&#xff0c…

力扣第446场周赛

有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下&#xff1a;力扣 给你两个数组&#xff1a;instructions 和 values&#xff0c;数组的长度均为 n。 你需要根据以下规则模拟一个过程&#xff1a; 从下标 i 0 的第一个指令开…

OpenCV中的透视变换方法详解

文章目录 引言1. 什么是透视变换2. 透视变换的数学原理3. OpenCV中的透视变换代码实现3.1 首先定义四个函数 3.1.1 cv_show() 函数 3.1.2 def resize() 函数 3.1.3 order_points() 函数 3.1.4 four_point_transform() 函数 3.2 读取图片并做预处理3.3 轮廓检测3.4 获取最大…

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

如何理解抽象且不易理解的华为云 API?

API的概念在华为云的使用中非常抽象&#xff0c;且不容易理解&#xff0c;用通俗的语言 形象的比喻来讲清楚——什么是华为云 API&#xff0c;怎么用&#xff0c;背后原理&#xff0c;以及主要元素有哪些&#xff0c;尽量让新手也能明白。 &#x1f9e0; 一句话先理解&#xf…

深度学习-全连接神经网络(过拟合,欠拟合。批量标准化)

七、过拟合与欠拟合 在训练深层神经网络时&#xff0c;由于模型参数较多&#xff0c;在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合&#xff0c;提升模型的泛化能力(对新数据表现良好)和鲁棒性&#xff08;对异常数据表现良好&#xff09;。 1. 概念认知 …

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

流水线记忆要点‌ ‌公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt&#xff08;max&#xff09; 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期&#xff1a;最长段Δt 冲突‌&#xff1a; ‌数据冲突&#xff08;RAW&#xff09; → 旁路/…

复刻低成本机械臂 SO-ARM100 3D 打印篇

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机&#xff0c;挤出机也裂了&#xff0c;更换了喷嘴和挤出机夹具&#xff0c;终于恢复了正常工作的状态&#xff0c;接下来还是要用起来&#xff0c;不然吃灰生锈了&#xff0c;于是乎想起…

Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有

错误信息&#xff1a; SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用&#xff1a;所有请求的入口&#xff0c;负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…

使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互

引言 在现代前端开发中&#xff0c;与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端&#xff0c;以其简洁易用、功能强大的特点&#xff0c;成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…