This repository has been archived by the owner on Feb 5, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
/
lazyimport.py
71 lines (48 loc) · 2.23 KB
/
lazyimport.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
""":mod:`sider.lazyimport` --- Lazily imported modules
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides a :class:`types.ModuleType`-like proxy object for submodules of
the :mod:`sider` package. These are for workaround circular importing.
"""
from __future__ import absolute_import
import types
import functools
class DeferredModule(types.ModuleType):
"""The deferred version of :class:`types.ModuleType`.
Under the hood it imports the actual module when it actually has to.
"""
def __init__(self, *args, **kwargs):
super(DeferredModule, self).__init__(*args, **kwargs)
self.__actual_module__ = None
def __getattr__(self, name):
mod = self.__actual_module__
if mod is None:
mod = __import__(self.__name__)
mod = functools.reduce(getattr, self.__name__.split('.')[1:], mod)
self.__actual_module__ = mod
return getattr(mod, name)
def __repr__(self):
return '<deferred module {0!r}>'.format(self.__name__)
#: (:class:`DeferredModule`) Alias of :mod:`sider.session`.
session = DeferredModule('sider.session')
#: (:class:`DeferredModule`) Alias of :mod:`sider.types`.
types = DeferredModule('sider.types')
#: (:class:`DeferredModule`) Alias of :mod:`sider.transaction`.
transaction = DeferredModule('sider.transaction')
#: (:class:`DeferredModule`) Alias of :mod:`sider.hash`.
hash = DeferredModule('sider.hash')
#: (:class:`DeferredModule`) Alias of :mod:`sider.list`.
list = DeferredModule('sider.list')
#: (:class:`DeferredModule`) Alias of :mod:`sider.set`.
set = DeferredModule('sider.set')
#: (:class:`DeferredModule`) Alias of :mod:`sider.sortedset`.
sortedset = DeferredModule('sider.sortedset')
#: (:class:`DeferredModule`) Alias of :mod:`sider.datetime`.
datetime = DeferredModule('sider.datetime')
#: (:class:`DeferredModule`) Alias of :mod:`sider.warnings`.
warnings = DeferredModule('sider.warnings')
#: (:class:`DeferredModule`) Alias of :mod:`sider.exceptions`.
exceptions = DeferredModule('sider.exceptions')
#: (:class:`DeferredModule`) Alias of :mod:`sider.version`.
version = DeferredModule('sider.version')
__all__ = tuple(name for name, value in globals().items()
if isinstance(value, DeferredModule))