[lazy_extractor] Import actual class if an attribute is accessed

Now all core tests pass with lazy extraction enabled
This commit is contained in:
pukkandan 2021-08-23 03:48:26 +05:30
parent 1151c4079a
commit 5bc4a65eea
No known key found for this signature in database
GPG Key ID: 0F00D95A001F4698

View File

@ -1,16 +1,24 @@
#!/usr/bin/env python3
# coding: utf-8 # coding: utf-8
from __future__ import unicode_literals
import re import re
class LazyLoadExtractor(object): class LazyLoadMetaClass(type):
def __getattr__(cls, name):
return getattr(cls._get_real_class(), name)
class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
_module = None _module = None
@classmethod
def _get_real_class(cls):
if '__real_class' not in cls.__dict__:
mod = __import__(cls._module, fromlist=(cls.__name__,))
cls.__real_class = getattr(mod, cls.__name__)
return cls.__real_class
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
mod = __import__(cls._module, fromlist=(cls.__name__,)) real_cls = cls._get_real_class()
real_cls = getattr(mod, cls.__name__)
instance = real_cls.__new__(real_cls) instance = real_cls.__new__(real_cls)
instance.__init__(*args, **kwargs) instance.__init__(*args, **kwargs)
return instance return instance