#!/usr/bin/env python3 """ 配置模块 - 统一管理项目配置 """ import os from pathlib import Path from typing import Optional class Config: """项目配置类""" # 默认缓存根目录(用户主目录下的 cache) _DEFAULT_CACHE_ROOT = os.path.expanduser("~/cache") # 缓存根目录 _cache_root: Optional[str] = None @classmethod def get_cache_root(cls) -> str: """ 获取缓存根目录 Returns: 缓存根目录路径 """ if cls._cache_root is None: # 1. 优先从环境变量读取 cache_root = os.environ.get("CACHE_ROOT") if cache_root: cls._cache_root = cache_root else: # 2. 使用默认路径 cls._cache_root = cls._DEFAULT_CACHE_ROOT return cls._cache_root @classmethod def set_cache_root(cls, path: str) -> None: """ 设置缓存根目录 Args: path: 缓存根目录路径(可以是绝对路径或相对路径) """ cls._cache_root = path @classmethod def get_cache_dir(cls, subdir: str) -> str: """ 获取特定子模块的缓存目录 Args: subdir: 子目录名称,如: - "text_embedding", "semantic_similarity" - 计算缓存 - "data/search", "data/detail" - 爬虫数据缓存 - "data/analysis" - 分析结果缓存 Returns: 完整的缓存目录路径 """ cache_root = cls.get_cache_root() return str(Path(cache_root) / subdir) @classmethod def get_data_dir(cls, subdir: str = "") -> str: """ 获取数据缓存目录(data 目录现在在缓存根目录下) Args: subdir: 子目录名称,如 "search", "detail", "tools_list" 等 如果为空字符串,返回 data 根目录 Returns: 完整的数据目录路径 Note: data 目录现在统一放在缓存根目录下: - 默认:cache/data/ - 如果设置了 CACHE_ROOT=/custom: /custom/data/ """ cache_root = cls.get_cache_root() if subdir: return str(Path(cache_root) / "data" / subdir) return str(Path(cache_root) / "data") @classmethod def reset(cls) -> None: """ 重置配置为默认值(主要用于测试) """ cls._cache_root = None # 便捷函数 def get_cache_root() -> str: """获取缓存根目录""" return Config.get_cache_root() def set_cache_root(path: str) -> None: """设置缓存根目录""" Config.set_cache_root(path) def get_cache_dir(subdir: str) -> str: """获取特定子模块的缓存目录""" return Config.get_cache_dir(subdir) def get_data_dir(subdir: str = "") -> str: """ 获取数据缓存目录 Note: data 目录现在在缓存根目录下,例如 cache/data/ """ return Config.get_data_dir(subdir) if __name__ == "__main__": print("=" * 60) print("配置模块示例") print("=" * 60) print() # 示例 1: 使用默认配置 print("示例 1: 默认配置") print(f"缓存根目录: {get_cache_root()}") print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}") print(f"semantic_similarity 缓存: {get_cache_dir('semantic_similarity')}") print() # 示例 2: 自定义缓存根目录 print("示例 2: 自定义缓存根目录") set_cache_root("/tmp/my_cache") print(f"缓存根目录: {get_cache_root()}") print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}") print(f"semantic_similarity 缓存: {get_cache_dir('semantic_similarity')}") print() # 示例 3: 使用相对路径 print("示例 3: 使用相对路径") set_cache_root("data/cache") print(f"缓存根目录: {get_cache_root()}") print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}") print() # 示例 4: 通过环境变量设置 print("示例 4: 通过环境变量设置") Config.reset() # 重置配置 os.environ["CACHE_ROOT"] = "/Users/semsevens/Desktop/workspace/daily/1113/how_1120_v3/cache" print(f"缓存根目录: {get_cache_root()}") print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}") print() # 示例 5: 数据目录配置(在缓存根目录下) print("示例 5: 数据目录配置(在缓存根目录下)") Config.reset() # 重置配置 print(f"缓存根目录: {get_cache_root()}") print(f"data 目录: {get_data_dir()}") print(f"search 数据: {get_data_dir('search')}") print(f"detail 数据: {get_data_dir('detail')}") print() # 示例 6: 设置缓存根目录后,data 也会跟着变 print("示例 6: 设置缓存根目录后,data 也会跟着变") set_cache_root("/custom/cache") print(f"缓存根目录: {get_cache_root()}") print(f"data 目录: {get_data_dir()}") print(f"search 数据: {get_data_dir('search')}") print() print("=" * 60) print("使用方法:") print("-" * 60) print("缓存根目录:") print(" 1. 默认使用 'cache' 目录") print(" 2. 通过代码设置: set_cache_root('/path/to/cache')") print(" 3. 通过环境变量: export CACHE_ROOT=/path/to/cache") print() print("目录结构:") print(" cache/") print(" ├── text_embedding/ # 向量相似度缓存") print(" ├── semantic_similarity/ # 语义相似度缓存") print(" └── data/ # 数据缓存(原 data 目录)") print(" ├── search/ # 搜索数据") print(" ├── detail/ # 详情数据") print(" └── analysis/ # 分析结果") print("=" * 60)