diff --git a/qlib/finco/utils.py b/qlib/finco/utils.py index 305f71994..aa4107021 100644 --- a/qlib/finco/utils.py +++ b/qlib/finco/utils.py @@ -3,16 +3,23 @@ import json from fuzzywuzzy import fuzz -class Singleton(type): +class SingletonMeta(type): _instance = None def __call__(cls, *args, **kwargs): if cls._instance is None: - cls._instance = super(Singleton, cls).__call__(*args, **kwargs) + cls._instance = super(SingletonMeta, cls).__call__(*args, **kwargs) return cls._instance -class SingletonBaseClass(metaclass=Singleton): - pass + +class SingletonBaseClass(metaclass=SingletonMeta): + """ + Because we try to support defining Singleton with `class A(SingletonBaseClass)` instead of `A(metaclass=SingletonMeta)` + This class becomes necessary + + """ + # TODO: Add move this class to Qlib's general utils. + def parse_json(response): try: diff --git a/tests/finco/test_utils.py b/tests/finco/test_utils.py new file mode 100644 index 000000000..a0b858a34 --- /dev/null +++ b/tests/finco/test_utils.py @@ -0,0 +1,23 @@ +import unittest +from qlib.finco.utils import SingletonBaseClass + + +class TimeUtils(unittest.TestCase): + + def test_singleton(self): + # self.assertEqual(self.to_str(data.tail()), self.to_str(res)) + closure_checker = [] + + class A(SingletonBaseClass): + + def __init__(self) -> None: + closure_checker.append(0) + + A() + self.assertEqual(len(closure_checker), 1) + A() + self.assertEqual(len(closure_checker), 1) + + +if __name__ == "__main__": + unittest.main()