~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lazy_import.py

  • Committer: Jelmer Vernooij
  • Date: 2011-04-09 19:25:42 UTC
  • mto: (5777.5.1 inventoryworkingtree)
  • mto: This revision was merged to the branch mainline in revision 5781.
  • Revision ID: jelmer@samba.org-20110409192542-8bbedp36s7nj928e
Split InventoryTree out of Tree.

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::
23
 
 
 
22
in an on-demand fashion. Typically use looks like:
24
23
    from bzrlib.lazy_import import lazy_import
25
24
    lazy_import(globals(), '''
26
25
    from bzrlib import (
31
30
    import bzrlib.branch
32
31
    ''')
33
32
 
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.
 
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.
36
35
 
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).
 
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).
42
41
"""
43
42
 
44
43
 
98
97
 
99
98
    def _cleanup(self):
100
99
        """Stop holding on to all the extra stuff"""
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
 
 
 
100
        del self._factory
 
101
        del self._scope
114
102
        # We keep _name, so that we can report errors
115
103
        # del self._name
116
104
 
172
160
            None, indicating the module is being imported.
173
161
        :param children: Children entries to be imported later.
174
162
            This should be a map of children specifications.
175
 
            ::
176
 
            
177
 
                {'foo':(['bzrlib', 'foo'], None,
178
 
                    {'bar':(['bzrlib', 'foo', 'bar'], None {})})
179
 
                }
180
 
 
181
 
        Examples::
182
 
 
 
163
            {'foo':(['bzrlib', 'foo'], None,
 
164
                {'bar':(['bzrlib', 'foo', 'bar'], None {})})
 
165
            }
 
166
        Examples:
183
167
            import foo => name='foo' module_path='foo',
184
168
                          member=None, children={}
185
169
            import foo.bar => name='foo' module_path='foo', member=None,
386
370
def lazy_import(scope, text, lazy_import_class=None):
387
371
    """Create lazy imports for all of the imports in text.
388
372
 
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
 
        ''')
 
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
    ''')
401
384
 
402
385
    Then 'foo, bar, baz' and 'bzrlib' will exist as lazy-loaded
403
386
    objects which will be replaced with a real object on first use.