__init__.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import importlib
  2. import inspect
  3. import pkgutil
  4. from app.strategies.base import BaseStrategy
  5. def _iter_concrete_strategies() -> list[type[BaseStrategy]]:
  6. import app.strategies.impl as impl_package
  7. strategies: list[type[BaseStrategy]] = []
  8. seen_ids: set[str] = set()
  9. for module_info in pkgutil.iter_modules(impl_package.__path__):
  10. if module_info.name.startswith("_"):
  11. continue
  12. module = importlib.import_module(f"{impl_package.__name__}.{module_info.name}")
  13. for _, cls in inspect.getmembers(module, inspect.isclass):
  14. if cls.__module__ != module.__name__:
  15. continue
  16. if not issubclass(cls, BaseStrategy) or cls is BaseStrategy:
  17. continue
  18. if inspect.isabstract(cls):
  19. continue
  20. strategy_id = getattr(cls, "strategy_id", "").strip()
  21. if not strategy_id:
  22. continue
  23. if strategy_id in seen_ids:
  24. raise ValueError(f"duplicate strategy_id in impl package: {strategy_id}")
  25. seen_ids.add(strategy_id)
  26. strategies.append(cls)
  27. return strategies
  28. def register_all() -> None:
  29. """自动扫描 impl/ 下策略模块并注册(跳过 _ 开头的模块/基类)。"""
  30. from app.strategies.registry import StrategyRegistry
  31. for strategy_cls in _iter_concrete_strategies():
  32. StrategyRegistry.register(strategy_cls())