Mercurial > hg
comparison mercurial/demandimport.py @ 26455:f2bf76d3d567
demandimport: consolidate code for processing items in fromlist
This code was mostly duplicated. An upcoming patch will add more
complexity, making the duplication harder to justify. Consolidate the
code.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 03 Oct 2015 15:30:17 -0700 |
parents | 3beed01daff9 |
children | 86fc4a2863ff |
comparison
equal
deleted
inserted
replaced
26454:62c5e937f477 | 26455:f2bf76d3d567 |
---|---|
141 # level == -1: relative and absolute attempted (Python 2 only). | 141 # level == -1: relative and absolute attempted (Python 2 only). |
142 # level >= 0: absolute only (Python 2 w/ absolute_import and Python 3). | 142 # level >= 0: absolute only (Python 2 w/ absolute_import and Python 3). |
143 # The modern Mercurial convention is to use absolute_import everywhere, | 143 # The modern Mercurial convention is to use absolute_import everywhere, |
144 # so modern Mercurial code will have level >= 0. | 144 # so modern Mercurial code will have level >= 0. |
145 | 145 |
146 def processfromitem(mod, attr, **kwargs): | |
147 """Process an imported symbol in the import statement. | |
148 | |
149 If the symbol doesn't exist in the parent module, it must be a | |
150 module. We set missing modules up as _demandmod instances. | |
151 """ | |
152 if getattr(mod, attr, nothing) is nothing: | |
153 setattr(mod, attr, | |
154 _demandmod(attr, mod.__dict__, locals, **kwargs)) | |
155 | |
146 if level >= 0: | 156 if level >= 0: |
147 # Mercurial's enforced import style does not use | 157 # Mercurial's enforced import style does not use |
148 # "from a import b,c,d" or "from .a import b,c,d" syntax. In | 158 # "from a import b,c,d" or "from .a import b,c,d" syntax. In |
149 # addition, this appears to be giving errors with some modules | 159 # addition, this appears to be giving errors with some modules |
150 # for unknown reasons. Since we shouldn't be using this syntax | 160 # for unknown reasons. Since we shouldn't be using this syntax |
152 if name: | 162 if name: |
153 return _hgextimport(_origimport, name, globals, locals, | 163 return _hgextimport(_origimport, name, globals, locals, |
154 fromlist, level) | 164 fromlist, level) |
155 | 165 |
156 mod = _hgextimport(_origimport, name, globals, locals, level=level) | 166 mod = _hgextimport(_origimport, name, globals, locals, level=level) |
167 | |
157 for x in fromlist: | 168 for x in fromlist: |
158 # Missing symbols mean they weren't defined in the module | 169 processfromitem(mod, x, level=level) |
159 # itself which means they are sub-modules. | |
160 if getattr(mod, x, nothing) is nothing: | |
161 setattr(mod, x, | |
162 _demandmod(x, mod.__dict__, locals, level=level)) | |
163 | 170 |
164 return mod | 171 return mod |
165 | 172 |
166 # But, we still need to support lazy loading of standard library and 3rd | 173 # But, we still need to support lazy loading of standard library and 3rd |
167 # party modules. So handle level == -1. | 174 # party modules. So handle level == -1. |
170 for comp in name.split('.')[1:]: | 177 for comp in name.split('.')[1:]: |
171 if getattr(mod, comp, nothing) is nothing: | 178 if getattr(mod, comp, nothing) is nothing: |
172 setattr(mod, comp, | 179 setattr(mod, comp, |
173 _demandmod(comp, mod.__dict__, mod.__dict__)) | 180 _demandmod(comp, mod.__dict__, mod.__dict__)) |
174 mod = getattr(mod, comp) | 181 mod = getattr(mod, comp) |
182 | |
175 for x in fromlist: | 183 for x in fromlist: |
176 # set requested submodules for demand load | 184 processfromitem(mod, x) |
177 if getattr(mod, x, nothing) is nothing: | 185 |
178 setattr(mod, x, _demandmod(x, mod.__dict__, locals)) | |
179 return mod | 186 return mod |
180 | 187 |
181 ignore = [ | 188 ignore = [ |
182 '__future__', | 189 '__future__', |
183 '_hashlib', | 190 '_hashlib', |