| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- API客户端基类
- """
- from abc import ABC, abstractmethod
- from typing import Any, Optional
- import logging
- import time
- from functools import wraps
- class BaseAPIClient(ABC):
- """API客户端基类,提供统一的重试、缓存、日志功能"""
- def __init__(
- self,
- api_name: str,
- max_retries: int = 3,
- retry_delay: float = 2.0,
- logger: Optional[logging.Logger] = None
- ):
- self.api_name = api_name
- self.max_retries = max_retries
- self.retry_delay = retry_delay
- self.logger = logger or logging.getLogger(api_name)
- def with_retry(self, func):
- """重试装饰器"""
- @wraps(func)
- def wrapper(*args, **kwargs):
- for attempt in range(1, self.max_retries + 1):
- try:
- return func(*args, **kwargs)
- except Exception as e:
- self.logger.warning(
- f"[{self.api_name}] Attempt {attempt}/{self.max_retries} failed: {e}"
- )
- if attempt < self.max_retries:
- time.sleep(self.retry_delay)
- else:
- self.logger.error(f"[{self.api_name}] All retries failed: {e}")
- raise
- return None
- return wrapper
- @abstractmethod
- def call(self, *args, **kwargs) -> Any:
- """具体的API调用逻辑,子类实现"""
- pass
|