backtrader/config_manager.py

90 lines
2.9 KiB
Python
Raw Normal View History

import os
import yaml
from typing import Dict, Any
class ConfigManager:
"""配置管理器,负责加载和提供配置信息"""
_instance = None # 单例实例
def __new__(cls):
"""实现单例模式"""
if cls._instance is None:
cls._instance = super(ConfigManager, cls).__new__(cls)
cls._instance._config = None
return cls._instance
def load_config(self) -> Dict[str, Any]:
"""加载配置,如果配置文件不存在则创建默认配置"""
if self._config is not None:
return self._config
config_path = 'config.yaml'
if not os.path.exists(config_path):
# 如果配置文件不存在,创建默认配置
ConfigManager._create_default_config(config_path)
print(f"已创建新的配置文件 {config_path},请完善其中的配置信息后再运行。")
exit(1)
# 加载配置文件
with open(config_path, 'r', encoding='utf-8') as f:
self._config = yaml.safe_load(f)
return self._config
@staticmethod
def _create_default_config(config_path: str) -> None:
"""创建默认配置文件"""
default_config = {
'tushare_token': 'xxxxxxxxxxx',
'sqlite': {
'path': './data/tushare_data.db',
'database_name': 'tushare_data'
},
'log': {
'level': 'INFO',
'store': True,
'path': 'logs'
},
'llm': {
'api_key': '', # 需要用户填写
'api_base': 'https://api.openai.com/v1', # API基础URL
'model': 'gpt-3.5-turbo', # 默认模型
'temperature': 0.7, # 温度参数
}
}
# 确保目录存在
os.makedirs(os.path.dirname(config_path) or '.', exist_ok=True)
# 写入默认配置
with open(config_path, 'w', encoding='utf-8') as f:
yaml.dump(default_config, f, default_flow_style=False, allow_unicode=True)
def get_config(self) -> Dict[str, Any]:
"""获取配置,如果尚未加载则先加载"""
if self._config is None:
return self.load_config()
return self._config
def get(self, key: str, default=None) -> Any:
"""获取指定的配置项,支持使用点号访问嵌套配置"""
config = self.get_config()
# 处理嵌套键访问,如 "sqlite.path"
if '.' in key:
parts = key.split('.')
current = config
for part in parts:
if part not in current:
return default
current = current[part]
return current
return config.get(key, default)
# 提供简单的访问函数
def get_config_manager() -> ConfigManager:
"""获取配置管理器实例"""
return ConfigManager()