~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lazy_import.py

  • Committer: John Arbash Meinel
  • Date: 2006-09-11 21:56:26 UTC
  • mto: This revision was merged to the branch mainline in revision 2004.
  • Revision ID: john@arbash-meinel.com-20060911215626-0bbe834149b22b07
Create a method for handling 'import *' syntax.

This handles:
    import foo
    import foo.bar
    import foo.bar as baz
    import foo, foo.bar, baz.bing

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
This includes waiting to import a module until it is actually used.
20
20
"""
21
21
 
 
22
import re
22
23
import sys
23
24
 
24
25
 
146
147
                module_path=child_path, member=None,
147
148
                children=grandchildren)
148
149
        return module
 
150
 
 
151
 
 
152
def _convert_import_str_to_map(import_str, imports):
 
153
    """This converts a import string into a list of imports.
 
154
 
 
155
    This only understands 'import foo, foo.bar, foo.bar.baz as bing'
 
156
 
 
157
    :param import_str: The import string to process
 
158
    :param imports: The current map of all imports
 
159
    """
 
160
    assert import_str.startswith('import ')
 
161
    import_str = import_str[len('import '):]
 
162
 
 
163
    for path in import_str.split(','):
 
164
        path = path.strip()
 
165
        as_hunks = path.split(' as ')
 
166
        if len(as_hunks) == 2:
 
167
            # We have 'as' so this is a different style of import
 
168
            # 'import foo.bar.baz as bing' creates a local variable
 
169
            # named 'bing' which points to 'foo.bar.baz'
 
170
            name = as_hunks[1].strip()
 
171
            module_path = as_hunks[0].strip().split('.')
 
172
            assert name not in imports
 
173
            # No children available in 'import foo as bar'
 
174
            imports[name] = (module_path, None, {})
 
175
        else:
 
176
            # Now we need to handle
 
177
            module_path = path.split('.')
 
178
            name = module_path[0]
 
179
            if name not in imports:
 
180
                # This is a new import that we haven't seen before
 
181
                module_def = ([name], None, {})
 
182
                imports[name] = module_def
 
183
            else:
 
184
                module_def = imports[name]
 
185
 
 
186
            cur_path = [name]
 
187
            cur = module_def[2]
 
188
            for child in module_path[1:]:
 
189
                cur_path.append(child)
 
190
                if child in cur:
 
191
                    cur = cur[child]
 
192
                else:
 
193
                    next = (cur_path[:], None, {})
 
194
                    cur[child] = next
 
195
                    cur = next[2]