util.py 2.62 KB
# -*- coding: utf-8 -*-
"""
AIfeng/2025-01-27
工具函数模块
提供日志、打印等基础功能
"""

import time
import datetime
from typing import Any

def printInfo(level: int, username: str, message: str):
    """打印信息
    
    Args:
        level: 日志级别 (0-DEBUG, 1-INFO, 2-WARN, 3-ERROR)
        username: 用户名
        message: 消息内容
    """
    level_names = ['DEBUG', 'INFO', 'WARN', 'ERROR']
    level_name = level_names[min(level, 3)]
    timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[{timestamp}] [{level_name}] [{username}] {message}")

def log(level: int, message: str):
    """记录日志
    
    Args:
        level: 日志级别
        message: 日志消息
    """
    printInfo(level, 'SYSTEM', message)

def get_timestamp() -> str:
    """获取当前时间戳字符串"""
    return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

def format_duration(seconds: float) -> str:
    """格式化时长
    
    Args:
        seconds: 秒数
        
    Returns:
        格式化的时长字符串
    """
    if seconds < 60:
        return f"{seconds:.2f}秒"
    elif seconds < 3600:
        minutes = int(seconds // 60)
        secs = seconds % 60
        return f"{minutes}分{secs:.1f}秒"
    else:
        hours = int(seconds // 3600)
        minutes = int((seconds % 3600) // 60)
        secs = seconds % 60
        return f"{hours}时{minutes}分{secs:.1f}秒"

def safe_print(obj: Any, prefix: str = ""):
    """安全打印对象,避免编码错误
    
    Args:
        obj: 要打印的对象
        prefix: 前缀字符串
    """
    try:
        print(f"{prefix}{obj}")
    except UnicodeEncodeError:
        print(f"{prefix}{repr(obj)}")
    except Exception as e:
        print(f"{prefix}[打印错误: {e}]")

class Timer:
    """简单的计时器类"""
    
    def __init__(self):
        self.start_time = None
        self.end_time = None
    
    def start(self):
        """开始计时"""
        self.start_time = time.time()
        return self
    
    def stop(self):
        """停止计时"""
        self.end_time = time.time()
        return self
    
    def elapsed(self) -> float:
        """获取经过的时间(秒)"""
        if self.start_time is None:
            return 0.0
        end = self.end_time if self.end_time else time.time()
        return end - self.start_time
    
    def elapsed_str(self) -> str:
        """获取格式化的经过时间"""
        return format_duration(self.elapsed())
    
    def __enter__(self):
        return self.start()
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.stop()