~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to HACKING

  • Committer: John Arbash Meinel
  • Date: 2006-09-12 19:37:02 UTC
  • mto: This revision was merged to the branch mainline in revision 2004.
  • Revision ID: john@arbash-meinel.com-20060912193702-22c752299731a663
HACKING and NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
209
209
> factory, then yes, foo_factory is what I would use.
210
210
 
211
211
 
 
212
Lazy Imports
 
213
------------
 
214
 
 
215
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
 
216
delay importing modules until they are actually used. ``lazy_import`` uses
 
217
the same syntax as regular python imports. So to import a few modules in a
 
218
lazy fashion do::
 
219
 
 
220
  from bzrlib.lazy_import import lazy_import
 
221
  lazy_import(globals(), """
 
222
  import os
 
223
  import subprocess
 
224
  import sys
 
225
  import time
 
226
 
 
227
  from bzrlib import (
 
228
     errors,
 
229
     transport,
 
230
     foo as bar,
 
231
     )
 
232
  import bzrlib.transport
 
233
  import bzrlib.xml5
 
234
  """)
 
235
 
 
236
At this point, all of these exist as a ``ImportReplacer`` object, ready to
 
237
be imported once a member is accessed.
 
238
 
 
239
 
 
240
Modules versus Members
 
241
~~~~~~~~~~~~~~~~~~~~~~
 
242
 
 
243
While it is possible for ``lazy_import()`` to import members of a module
 
244
wehn using the ``from module import member`` syntax, it is recommended to
 
245
only use that syntax to load sub modules ``from module import submodule``.
 
246
This is because variables and classes can frequently be used without
 
247
needing a sub-member for example::
 
248
 
 
249
  lazy_import(globals(), """
 
250
  from module import MyClass
 
251
  """)
 
252
 
 
253
  def test(x):
 
254
      return isinstance(x, MyClass)
 
255
 
 
256
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
 
257
object, rather than the real class.
 
258
 
 
259
 
 
260
Passing to other variables
 
261
~~~~~~~~~~~~~~~~~~~~~~~~~~
 
262
 
 
263
It also is bad form to pass ``ImportReplacer`` objects to other variables.
 
264
Because the replacer only knows about the original name, it is unable to
 
265
replace other variables. The ``ImportReplacer`` class will raise an
 
266
exception if it can figure out that this happened. But it is not always
 
267
possible to know, so bugs can be secretly waiting to be exposed.
 
268
 
 
269
 
212
270
Writing output
213
271
==============
214
272