~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lazy_import.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-16 19:18:39 UTC
  • mto: This revision was merged to the branch mainline in revision 6391.
  • Revision ID: jelmer@samba.org-20111216191839-eg681lxqibi1qxu1
Fix remaining tests.

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
Most commonly, the 'lazy_import' function is used to import other modules
22
 
in an on-demand fashion. Typically use looks like:
 
22
in an on-demand fashion. Typically use looks like::
 
23
 
23
24
    from bzrlib.lazy_import import lazy_import
24
25
    lazy_import(globals(), '''
25
26
    from bzrlib import (
30
31
    import bzrlib.branch
31
32
    ''')
32
33
 
33
 
    Then 'errors, osutils, branch' and 'bzrlib' will exist as lazy-loaded
34
 
    objects which will be replaced with a real object on first use.
 
34
Then 'errors, osutils, branch' and 'bzrlib' will exist as lazy-loaded
 
35
objects which will be replaced with a real object on first use.
35
36
 
36
 
    In general, it is best to only load modules in this way. This is because
37
 
    it isn't safe to pass these variables to other functions before they
38
 
    have been replaced. This is especially true for constants, sometimes
39
 
    true for classes or functions (when used as a factory, or you want
40
 
    to inherit from them).
 
37
In general, it is best to only load modules in this way. This is because
 
38
it isn't safe to pass these variables to other functions before they
 
39
have been replaced. This is especially true for constants, sometimes
 
40
true for classes or functions (when used as a factory, or you want
 
41
to inherit from them).
41
42
"""
42
43
 
43
44
 
97
98
 
98
99
    def _cleanup(self):
99
100
        """Stop holding on to all the extra stuff"""
100
 
        del self._factory
101
 
        del self._scope
 
101
        try:
 
102
            del self._factory
 
103
        except AttributeError:
 
104
            # Oops, we just lost a race with another caller of _cleanup.  Just
 
105
            # ignore it.
 
106
            pass
 
107
 
 
108
        try:
 
109
            del self._scope
 
110
        except AttributeError:
 
111
            # Another race loss.  See above.
 
112
            pass
 
113
 
102
114
        # We keep _name, so that we can report errors
103
115
        # del self._name
104
116
 
160
172
            None, indicating the module is being imported.
161
173
        :param children: Children entries to be imported later.
162
174
            This should be a map of children specifications.
163
 
            {'foo':(['bzrlib', 'foo'], None,
164
 
                {'bar':(['bzrlib', 'foo', 'bar'], None {})})
165
 
            }
166
 
        Examples:
 
175
            ::
 
176
            
 
177
                {'foo':(['bzrlib', 'foo'], None,
 
178
                    {'bar':(['bzrlib', 'foo', 'bar'], None {})})
 
179
                }
 
180
 
 
181
        Examples::
 
182
 
167
183
            import foo => name='foo' module_path='foo',
168
184
                          member=None, children={}
169
185
            import foo.bar => name='foo' module_path='foo', member=None,
370
386
def lazy_import(scope, text, lazy_import_class=None):
371
387
    """Create lazy imports for all of the imports in text.
372
388
 
373
 
    This is typically used as something like:
374
 
    from bzrlib.lazy_import import lazy_import
375
 
    lazy_import(globals(), '''
376
 
    from bzrlib import (
377
 
        foo,
378
 
        bar,
379
 
        baz,
380
 
        )
381
 
    import bzrlib.branch
382
 
    import bzrlib.transport
383
 
    ''')
 
389
    This is typically used as something like::
 
390
 
 
391
        from bzrlib.lazy_import import lazy_import
 
392
        lazy_import(globals(), '''
 
393
        from bzrlib import (
 
394
            foo,
 
395
            bar,
 
396
            baz,
 
397
            )
 
398
        import bzrlib.branch
 
399
        import bzrlib.transport
 
400
        ''')
384
401
 
385
402
    Then 'foo, bar, baz' and 'bzrlib' will exist as lazy-loaded
386
403
    objects which will be replaced with a real object on first use.