25 ''' |
25 ''' |
26 |
26 |
27 import __builtin__ |
27 import __builtin__ |
28 _origimport = __import__ |
28 _origimport = __import__ |
29 |
29 |
|
30 nothing = object() |
|
31 |
30 class _demandmod(object): |
32 class _demandmod(object): |
31 """module demand-loader and proxy""" |
33 """module demand-loader and proxy""" |
32 def __init__(self, name, globals, locals): |
34 def __init__(self, name, globals, locals): |
33 if '.' in name: |
35 if '.' in name: |
34 head, rest = name.split('.', 1) |
36 head, rest = name.split('.', 1) |
48 # load submodules |
50 # load submodules |
49 def subload(mod, p): |
51 def subload(mod, p): |
50 h, t = p, None |
52 h, t = p, None |
51 if '.' in p: |
53 if '.' in p: |
52 h, t = p.split('.', 1) |
54 h, t = p.split('.', 1) |
53 if not hasattr(mod, h): |
55 if getattr(mod, h, nothing) is nothing: |
54 setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__)) |
56 setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__)) |
55 elif t: |
57 elif t: |
56 subload(getattr(mod, h), t) |
58 subload(getattr(mod, h), t) |
57 |
59 |
58 for x in after: |
60 for x in after: |
107 return _origimport(name, globals, locals, fromlist, level) |
109 return _origimport(name, globals, locals, fromlist, level) |
108 # from a import b,c,d |
110 # from a import b,c,d |
109 mod = _origimport(name, globals, locals) |
111 mod = _origimport(name, globals, locals) |
110 # recurse down the module chain |
112 # recurse down the module chain |
111 for comp in name.split('.')[1:]: |
113 for comp in name.split('.')[1:]: |
112 if not hasattr(mod, comp): |
114 if getattr(mod, comp, nothing) is nothing: |
113 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__)) |
115 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__)) |
114 mod = getattr(mod, comp) |
116 mod = getattr(mod, comp) |
115 for x in fromlist: |
117 for x in fromlist: |
116 # set requested submodules for demand load |
118 # set requested submodules for demand load |
117 if not hasattr(mod, x): |
119 if getattr(mod, x, nothing) is nothing: |
118 setattr(mod, x, _demandmod(x, mod.__dict__, locals)) |
120 setattr(mod, x, _demandmod(x, mod.__dict__, locals)) |
119 return mod |
121 return mod |
120 |
122 |
121 ignore = [ |
123 ignore = [ |
122 '_hashlib', |
124 '_hashlib', |