diff --git a/qlib/finco/conf.py b/qlib/finco/conf.py index 29a7e43471..85e02e2cc6 100644 --- a/qlib/finco/conf.py +++ b/qlib/finco/conf.py @@ -1,11 +1,11 @@ # TODO: use pydantic for other modules in Qlib from pydantic import BaseSettings -from qlib.finco.utils import Singleton +from qlib.finco.utils import SingletonBaseClass import os -class Config(Singleton): +class Config(SingletonBaseClass): """ This config is for fast demo purpose. Please use BaseSettings insetead in the future diff --git a/qlib/finco/llm.py b/qlib/finco/llm.py index 08df6e0617..2a42a1d982 100644 --- a/qlib/finco/llm.py +++ b/qlib/finco/llm.py @@ -4,11 +4,11 @@ import json from typing import Optional from qlib.finco.conf import Config -from qlib.finco.utils import Singleton +from qlib.finco.utils import SingletonBaseClass from qlib.finco.log import FinCoLog -class APIBackend(Singleton): +class APIBackend(SingletonBaseClass): def __init__(self): self.cfg = Config() openai.api_key = self.cfg.openai_api_key diff --git a/qlib/finco/log.py b/qlib/finco/log.py index 03d88db114..7d4b681183 100644 --- a/qlib/finco/log.py +++ b/qlib/finco/log.py @@ -4,7 +4,7 @@ import logging from typing import Dict, List -from qlib.finco.utils import Singleton +from qlib.finco.utils import SingletonBaseClass from contextlib import contextmanager @@ -66,7 +66,7 @@ def formatting_log(logger, title="Info"): logger.info("") -class FinCoLog(Singleton): +class FinCoLog(SingletonBaseClass): # TODO: # - config to file logger and save it into workspace def __init__(self) -> None: diff --git a/qlib/finco/prompt_template.py b/qlib/finco/prompt_template.py index 0efa9576a5..c056db5911 100644 --- a/qlib/finco/prompt_template.py +++ b/qlib/finco/prompt_template.py @@ -3,11 +3,11 @@ from jinja2 import Template import yaml -from qlib.finco.utils import Singleton +from qlib.finco.utils import SingletonBaseClass from qlib.finco import get_finco_path -class PromptTemplate(Singleton): +class PromptTemplate(SingletonBaseClass): def __init__(self) -> None: super().__init__() _template = yaml.load(open(Path.joinpath(get_finco_path(), "prompt_template.yaml"), "r"), diff --git a/qlib/finco/task.py b/qlib/finco/task.py index 5e61c81d0b..d9db799b87 100644 --- a/qlib/finco/task.py +++ b/qlib/finco/task.py @@ -723,9 +723,9 @@ def execute(self): # TODO hotfix for the bug that the record signalrecord config is not updated for record in target_config['task']['record']: if record['class'] == 'SignalRecord': - if 'model' in record['kwargs']: + if 'kwargs' in record and 'model' in record['kwargs']: del record['kwargs']["model"] - if 'dataset' in record['kwargs']: + if 'kwargs' in record and 'dataset' in record['kwargs']: del record['kwargs']["dataset"] # 4) save the config file diff --git a/qlib/finco/utils.py b/qlib/finco/utils.py index 4741eb69a2..305f71994d 100644 --- a/qlib/finco/utils.py +++ b/qlib/finco/utils.py @@ -3,14 +3,16 @@ from fuzzywuzzy import fuzz -class Singleton: +class Singleton(type): _instance = None - def __new__(cls, *args, **kwargs): + def __call__(cls, *args, **kwargs): if cls._instance is None: - cls._instance = super().__new__(cls, *args, **kwargs) + cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance +class SingletonBaseClass(metaclass=Singleton): + pass def parse_json(response): try: