2016-02-10 14:01:31 +01:00
|
|
|
import re
|
|
|
|
|
2021-09-17 20:23:55 +02:00
|
|
|
from ..utils import bug_reports_message, write_string
|
|
|
|
|
2016-02-10 14:01:31 +01:00
|
|
|
|
2021-08-23 00:18:26 +02:00
|
|
|
class LazyLoadMetaClass(type):
|
|
|
|
def __getattr__(cls, name):
|
2021-09-17 20:23:55 +02:00
|
|
|
if '_real_class' not in cls.__dict__:
|
|
|
|
write_string(
|
2022-04-29 03:48:36 +02:00
|
|
|
'WARNING: Falling back to normal extractor since lazy extractor '
|
2021-09-17 20:23:55 +02:00
|
|
|
f'{cls.__name__} does not have attribute {name}{bug_reports_message()}')
|
2021-08-23 00:18:26 +02:00
|
|
|
return getattr(cls._get_real_class(), name)
|
|
|
|
|
|
|
|
|
|
|
|
class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
|
2016-02-10 14:01:31 +01:00
|
|
|
_module = None
|
2021-08-23 01:15:30 +02:00
|
|
|
_WORKING = True
|
2016-02-10 14:01:31 +01:00
|
|
|
|
2021-08-23 00:18:26 +02:00
|
|
|
@classmethod
|
|
|
|
def _get_real_class(cls):
|
2021-09-17 20:23:55 +02:00
|
|
|
if '_real_class' not in cls.__dict__:
|
2021-08-23 00:18:26 +02:00
|
|
|
mod = __import__(cls._module, fromlist=(cls.__name__,))
|
2021-09-17 20:23:55 +02:00
|
|
|
cls._real_class = getattr(mod, cls.__name__)
|
|
|
|
return cls._real_class
|
2021-08-23 00:18:26 +02:00
|
|
|
|
2016-02-21 12:46:14 +01:00
|
|
|
def __new__(cls, *args, **kwargs):
|
2021-08-23 00:18:26 +02:00
|
|
|
real_cls = cls._get_real_class()
|
2016-02-21 12:46:14 +01:00
|
|
|
instance = real_cls.__new__(real_cls)
|
|
|
|
instance.__init__(*args, **kwargs)
|
|
|
|
return instance
|