# sanguo_data/config.py from dataclasses import dataclass import os import yaml @dataclass(frozen=True) class DataConfig: data_paths: dict data_sources: dict validation: dict performance: dict def load_config(path: str) -> DataConfig: try: with open(path, "r", encoding="utf-8") as f: raw = yaml.safe_load(f) except FileNotFoundError: raise FileNotFoundError(f"配置文件不存在: {path}") except yaml.YAMLError as e: raise ValueError(f"YAML解析失败: {e}") if not raw: raise ValueError(f"配置文件为空: {path}") return DataConfig( data_paths=raw.get("data_paths", {}), data_sources=raw.get("data_sources", {}), validation=raw.get("validation", {}), performance=raw.get("performance", {}), ) def find_config_path() -> str: """Locate data_platform.yaml: container /app/config first, then repo config/.""" candidates = [ "/app/config/data_platform.yaml", os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "data_platform.yaml"), "config/data_platform.yaml", ] for p in candidates: if os.path.exists(p): return p return candidates[0]