lazy_load_template.py 1008 B

123456789101112131415161718192021222324252627282930313233
  1. import importlib
  2. import random
  3. import re
  4. from ..utils import (
  5. age_restricted,
  6. bug_reports_message,
  7. classproperty,
  8. write_string,
  9. )
  10. class LazyLoadMetaClass(type):
  11. def __getattr__(cls, name):
  12. # "_TESTS" bloat the lazy_extractors
  13. if '_real_class' not in cls.__dict__ and name != 'get_testcases':
  14. write_string(
  15. 'WARNING: Falling back to normal extractor since lazy extractor '
  16. f'{cls.__name__} does not have attribute {name}{bug_reports_message()}\n')
  17. return getattr(cls.real_class, name)
  18. class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
  19. @classproperty
  20. def real_class(cls):
  21. if '_real_class' not in cls.__dict__:
  22. cls._real_class = getattr(importlib.import_module(cls._module), cls.__name__)
  23. return cls._real_class
  24. def __new__(cls, *args, **kwargs):
  25. instance = cls.real_class.__new__(cls.real_class)
  26. instance.__init__(*args, **kwargs)
  27. return instance