]> jfr.im git - yt-dlp.git/blob - devscripts/lazy_load_template.py
[build] Consistent order for lazy extractors (#4220)
[yt-dlp.git] / devscripts / lazy_load_template.py
1 import importlib
2 import random
3 import re
4
5 from ..utils import (
6 age_restricted,
7 bug_reports_message,
8 classproperty,
9 write_string,
10 )
11
12
13 class LazyLoadMetaClass(type):
14 def __getattr__(cls, name):
15 # "_TESTS" bloat the lazy_extractors
16 if '_real_class' not in cls.__dict__ and name != 'get_testcases':
17 write_string(
18 'WARNING: Falling back to normal extractor since lazy extractor '
19 f'{cls.__name__} does not have attribute {name}{bug_reports_message()}\n')
20 return getattr(cls.real_class, name)
21
22
23 class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
24 @classproperty
25 def real_class(cls):
26 if '_real_class' not in cls.__dict__:
27 cls._real_class = getattr(importlib.import_module(cls._module), cls.__name__)
28 return cls._real_class
29
30 def __new__(cls, *args, **kwargs):
31 instance = cls.real_class.__new__(cls.real_class)
32 instance.__init__(*args, **kwargs)
33 return instance