blob: e89582b3723a426b887a022b2cd8b23900d182c9 [file] [log] [blame]
Brett Cannonafccd632009-01-20 02:21:27 +00001:mod:`importlib` -- An implementation of :keyword:`import`
2==========================================================
3
4.. module:: importlib
5 :synopsis: An implementation of the import machinery.
6
7.. moduleauthor:: Brett Cannon <brett@python.org>
8.. sectionauthor:: Brett Cannon <brett@python.org>
9
10.. versionadded:: 3.1
11
12
13Introduction
14------------
15
16The purpose of the :mod:`importlib` package is two-fold. One is to provide an
17implementation of the :keyword:`import` statement (and thus, by extension, the
18:func:`__import__` function) in Python source code. This provides an
Tarek Ziadé434caaa2009-05-14 12:48:09 +000019implementation of :keyword:`import` which is portable to any Python
Brett Cannonafccd632009-01-20 02:21:27 +000020interpreter. This also provides a reference implementation which is easier to
Brett Cannondebb98d2009-02-16 04:18:01 +000021comprehend than one in a programming language other than Python.
Brett Cannonafccd632009-01-20 02:21:27 +000022
23Two, the components to implement :keyword:`import` can be exposed in this
24package, making it easier for users to create their own custom objects (known
Brett Cannondebb98d2009-02-16 04:18:01 +000025generically as an :term:`importer`) to participate in the import process.
26Details on providing custom importers can be found in :pep:`302`.
Brett Cannonafccd632009-01-20 02:21:27 +000027
28.. seealso::
29
30 :ref:`import`
31 The language reference for the :keyword:`import` statement.
32
33 `Packages specification <http://www.python.org/doc/essays/packages.html>`__
34 Original specification of packages. Some semantics have changed since
35 the writing of this document (e.g. redirecting based on :keyword:`None`
36 in :data:`sys.modules`).
37
38 The :func:`.__import__` function
39 The built-in function for which the :keyword:`import` statement is
Guido van Rossum09613542009-03-30 20:34:57 +000040 syntactic sugar.
Brett Cannonafccd632009-01-20 02:21:27 +000041
42 :pep:`235`
43 Import on Case-Insensitive Platforms
44
45 :pep:`263`
46 Defining Python Source Code Encodings
47
48 :pep:`302`
49 New Import Hooks.
50
51 :pep:`328`
52 Imports: Multi-Line and Absolute/Relative
53
54 :pep:`366`
55 Main module explicit relative imports
56
Brett Cannon8917d5e2010-01-13 19:21:00 +000057 :pep:`3120`
Brett Cannonafccd632009-01-20 02:21:27 +000058 Using UTF-8 as the Default Source Encoding
59
Brett Cannon30b7a902010-06-27 21:49:22 +000060 :pep:`3147`
61 PYC Repository Directories
62
Brett Cannonafccd632009-01-20 02:21:27 +000063
64Functions
65---------
66
Brett Cannon78246b62009-01-25 04:56:30 +000067.. function:: __import__(name, globals={}, locals={}, fromlist=list(), level=0)
Brett Cannonafccd632009-01-20 02:21:27 +000068
69 An implementation of the built-in :func:`__import__` function. See the
70 built-in function's documentation for usage instructions.
71
72.. function:: import_module(name, package=None)
73
Brett Cannon33418c82009-01-22 18:37:20 +000074 Import a module. The *name* argument specifies what module to
Brett Cannonafccd632009-01-20 02:21:27 +000075 import in absolute or relative terms
76 (e.g. either ``pkg.mod`` or ``..mod``). If the name is
Guido van Rossum09613542009-03-30 20:34:57 +000077 specified in relative terms, then the *package* argument must be set to
78 the name of the package which is to act as the anchor for resolving the
Brett Cannonafccd632009-01-20 02:21:27 +000079 package name (e.g. ``import_module('..mod', 'pkg.subpkg')`` will import
Brett Cannon2c318a12009-02-07 01:15:27 +000080 ``pkg.mod``).
Brett Cannon78246b62009-01-25 04:56:30 +000081
Brett Cannon2c318a12009-02-07 01:15:27 +000082 The :func:`import_module` function acts as a simplifying wrapper around
Brett Cannon9f4cb1c2009-04-01 23:26:47 +000083 :func:`importlib.__import__`. This means all semantics of the function are
84 derived from :func:`importlib.__import__`, including requiring the package
85 from which an import is occurring to have been previously imported
86 (i.e., *package* must already be imported). The most important difference
87 is that :func:`import_module` returns the most nested package or module
88 that was imported (e.g. ``pkg.mod``), while :func:`__import__` returns the
Guido van Rossum09613542009-03-30 20:34:57 +000089 top-level package or module (e.g. ``pkg``).
90
Brett Cannon78246b62009-01-25 04:56:30 +000091
Brett Cannon2a922ed2009-03-09 03:35:50 +000092:mod:`importlib.abc` -- Abstract base classes related to import
93---------------------------------------------------------------
94
95.. module:: importlib.abc
96 :synopsis: Abstract base classes related to import
97
98The :mod:`importlib.abc` module contains all of the core abstract base classes
99used by :keyword:`import`. Some subclasses of the core abstract base classes
100are also provided to help in implementing the core ABCs.
101
102
103.. class:: Finder
104
105 An abstract base class representing a :term:`finder`.
Guido van Rossum09613542009-03-30 20:34:57 +0000106 See :pep:`302` for the exact definition for a finder.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000107
Brett Cannon9c751b72009-03-09 16:28:16 +0000108 .. method:: find_module(fullname, path=None)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000109
110 An abstract method for finding a :term:`loader` for the specified
111 module. If the :term:`finder` is found on :data:`sys.meta_path` and the
Guido van Rossum09613542009-03-30 20:34:57 +0000112 module to be searched for is a subpackage or module then *path* will
113 be the value of :attr:`__path__` from the parent package. If a loader
Brett Cannon2a922ed2009-03-09 03:35:50 +0000114 cannot be found, :keyword:`None` is returned.
115
Brett Cannon2a922ed2009-03-09 03:35:50 +0000116
117.. class:: Loader
118
119 An abstract base class for a :term:`loader`.
Guido van Rossum09613542009-03-30 20:34:57 +0000120 See :pep:`302` for the exact definition for a loader.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000121
Brett Cannon9c751b72009-03-09 16:28:16 +0000122 .. method:: load_module(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000123
124 An abstract method for loading a module. If the module cannot be
125 loaded, :exc:`ImportError` is raised, otherwise the loaded module is
126 returned.
127
Guido van Rossum09613542009-03-30 20:34:57 +0000128 If the requested module already exists in :data:`sys.modules`, that
Brett Cannon2a922ed2009-03-09 03:35:50 +0000129 module should be used and reloaded.
Guido van Rossum09613542009-03-30 20:34:57 +0000130 Otherwise the loader should create a new module and insert it into
131 :data:`sys.modules` before any loading begins, to prevent recursion
132 from the import. If the loader inserted a module and the load fails, it
Brett Cannon2a922ed2009-03-09 03:35:50 +0000133 must be removed by the loader from :data:`sys.modules`; modules already
134 in :data:`sys.modules` before the loader began execution should be left
135 alone. The :func:`importlib.util.module_for_loader` decorator handles
136 all of these details.
137
Guido van Rossum09613542009-03-30 20:34:57 +0000138 The loader should set several attributes on the module.
139 (Note that some of these attributes can change when a module is
140 reloaded.)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000141
142 - :attr:`__name__`
143 The name of the module.
144
145 - :attr:`__file__`
146 The path to where the module data is stored (not set for built-in
147 modules).
148
149 - :attr:`__path__`
Guido van Rossum09613542009-03-30 20:34:57 +0000150 A list of strings specifying the search path within a
Brett Cannon2a922ed2009-03-09 03:35:50 +0000151 package. This attribute is not set on modules.
152
153 - :attr:`__package__`
154 The parent package for the module/package. If the module is
155 top-level then it has a value of the empty string. The
156 :func:`importlib.util.set_package` decorator can handle the details
157 for :attr:`__package__`.
158
159 - :attr:`__loader__`
Guido van Rossum09613542009-03-30 20:34:57 +0000160 The loader used to load the module.
161 (This is not set by the built-in import machinery,
162 but it should be set whenever a :term:`loader` is used.)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000163
164
165.. class:: ResourceLoader
166
167 An abstract base class for a :term:`loader` which implements the optional
168 :pep:`302` protocol for loading arbitrary resources from the storage
169 back-end.
170
Brett Cannon9c751b72009-03-09 16:28:16 +0000171 .. method:: get_data(path)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000172
173 An abstract method to return the bytes for the data located at *path*.
Guido van Rossum09613542009-03-30 20:34:57 +0000174 Loaders that have a file-like storage back-end
Brett Cannon16248a42009-04-01 20:47:14 +0000175 that allows storing arbitrary data
Guido van Rossum09613542009-03-30 20:34:57 +0000176 can implement this abstract method to give direct access
Brett Cannon2a922ed2009-03-09 03:35:50 +0000177 to the data stored. :exc:`IOError` is to be raised if the *path* cannot
178 be found. The *path* is expected to be constructed using a module's
Brett Cannon16248a42009-04-01 20:47:14 +0000179 :attr:`__file__` attribute or an item from a package's :attr:`__path__`.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000180
181
182.. class:: InspectLoader
183
184 An abstract base class for a :term:`loader` which implements the optional
Guido van Rossum09613542009-03-30 20:34:57 +0000185 :pep:`302` protocol for loaders that inspect modules.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000186
Brett Cannona113ac52009-03-15 01:41:33 +0000187 .. method:: get_code(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000188
Brett Cannona113ac52009-03-15 01:41:33 +0000189 An abstract method to return the :class:`code` object for a module.
190 :keyword:`None` is returned if the module does not have a code object
191 (e.g. built-in module). :exc:`ImportError` is raised if loader cannot
192 find the requested module.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000193
Brett Cannon9c751b72009-03-09 16:28:16 +0000194 .. method:: get_source(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000195
196 An abstract method to return the source of a module. It is returned as
Guido van Rossum09613542009-03-30 20:34:57 +0000197 a text string with universal newlines. Returns :keyword:`None` if no
Brett Cannon2a922ed2009-03-09 03:35:50 +0000198 source is available (e.g. a built-in module). Raises :exc:`ImportError`
199 if the loader cannot find the module specified.
200
Brett Cannona113ac52009-03-15 01:41:33 +0000201 .. method:: is_package(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000202
Brett Cannona113ac52009-03-15 01:41:33 +0000203 An abstract method to return a true value if the module is a package, a
204 false value otherwise. :exc:`ImportError` is raised if the
205 :term:`loader` cannot find the module.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000206
207
Brett Cannon69194272009-07-20 04:23:48 +0000208.. class:: ExecutionLoader
209
210 An abstract base class which inherits from :class:`InspectLoader` that,
Brett Cannon23460292009-07-20 22:59:00 +0000211 when implemented, helps a module to be executed as a script. The ABC
Brett Cannon69194272009-07-20 04:23:48 +0000212 represents an optional :pep:`302` protocol.
213
214 .. method:: get_filename(fullname)
215
216 An abstract method that is to return the value for :attr:`__file__` for
217 the specified module. If no path is available, :exc:`ImportError` is
218 raised.
219
220
Brett Cannon2a922ed2009-03-09 03:35:50 +0000221.. class:: PyLoader
222
Brett Cannon69194272009-07-20 04:23:48 +0000223 An abstract base class inheriting from
224 :class:`importlib.abc.ExecutionLoader` and
225 :class:`importlib.abc.ResourceLoader` designed to ease the loading of
Brett Cannon2a922ed2009-03-09 03:35:50 +0000226 Python source modules (bytecode is not handled; see
227 :class:`importlib.abc.PyPycLoader` for a source/bytecode ABC). A subclass
228 implementing this ABC will only need to worry about exposing how the source
229 code is stored; all other details for loading Python source code will be
230 handled by the concrete implementations of key methods.
231
Brett Cannon9c751b72009-03-09 16:28:16 +0000232 .. method:: source_path(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000233
234 An abstract method that returns the path to the source code for a
Brett Cannon3e761a92009-12-10 00:24:21 +0000235 module. Should return :keyword:`None` if there is no source code.
236 Raises :exc:`ImportError` if the loader knows it cannot handle the
237 module.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000238
Brett Cannon69194272009-07-20 04:23:48 +0000239 .. method:: get_filename(fullname)
240
241 A concrete implementation of
242 :meth:`importlib.abc.ExecutionLoader.get_filename` that
243 relies on :meth:`source_path`. If :meth:`source_path` returns
244 :keyword:`None`, then :exc:`ImportError` is raised.
245
Brett Cannon9c751b72009-03-09 16:28:16 +0000246 .. method:: load_module(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000247
248 A concrete implementation of :meth:`importlib.abc.Loader.load_module`
Brett Cannonad876c72009-03-09 07:53:09 +0000249 that loads Python source code. All needed information comes from the
250 abstract methods required by this ABC. The only pertinent assumption
251 made by this method is that when loading a package
252 :attr:`__path__` is set to ``[os.path.dirname(__file__)]``.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000253
Brett Cannon9c751b72009-03-09 16:28:16 +0000254 .. method:: get_code(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000255
256 A concrete implementation of
257 :meth:`importlib.abc.InspectLoader.get_code` that creates code objects
Guido van Rossum09613542009-03-30 20:34:57 +0000258 from Python source code, by requesting the source code (using
Benjamin Peterson0089d752009-11-13 00:52:43 +0000259 :meth:`source_path` and :meth:`get_data`) and compiling it with the
260 built-in :func:`compile` function.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000261
Brett Cannond43b30b2009-03-10 03:29:23 +0000262 .. method:: get_source(fullname)
263
264 A concrete implementation of
265 :meth:`importlib.abc.InspectLoader.get_source`. Uses
Brett Cannon69194272009-07-20 04:23:48 +0000266 :meth:`importlib.abc.ResourceLoader.get_data` and :meth:`source_path`
267 to get the source code. It tries to guess the source encoding using
Guido van Rossum09613542009-03-30 20:34:57 +0000268 :func:`tokenize.detect_encoding`.
Brett Cannond43b30b2009-03-10 03:29:23 +0000269
Brett Cannon2a922ed2009-03-09 03:35:50 +0000270
271.. class:: PyPycLoader
272
273 An abstract base class inheriting from :class:`importlib.abc.PyLoader`.
274 This ABC is meant to help in creating loaders that support both Python
275 source and bytecode.
276
Brett Cannon9c751b72009-03-09 16:28:16 +0000277 .. method:: source_mtime(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000278
279 An abstract method which returns the modification time for the source
280 code of the specified module. The modification time should be an
Brett Cannon69194272009-07-20 04:23:48 +0000281 integer. If there is no source code, return :keyword:`None`. If the
Brett Cannon2a922ed2009-03-09 03:35:50 +0000282 module cannot be found then :exc:`ImportError` is raised.
283
Brett Cannon9c751b72009-03-09 16:28:16 +0000284 .. method:: bytecode_path(fullname)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000285
286 An abstract method which returns the path to the bytecode for the
Guido van Rossum09613542009-03-30 20:34:57 +0000287 specified module, if it exists. It returns :keyword:`None`
288 if no bytecode exists (yet).
Brett Cannon3e761a92009-12-10 00:24:21 +0000289 Raises :exc:`ImportError` if the loader knows it cannot handle the
290 module.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000291
Brett Cannon69194272009-07-20 04:23:48 +0000292 .. method:: get_filename(fullname)
293
294 A concrete implementation of
295 :meth:`importlib.abc.ExecutionLoader.get_filename` that relies on
296 :meth:`importlib.abc.PyLoader.source_path` and :meth:`bytecode_path`.
297 If :meth:`source_path` returns a path, then that value is returned.
298 Else if :meth:`bytecode_path` returns a path, that path will be
299 returned. If a path is not available from both methods,
300 :exc:`ImportError` is raised.
301
Brett Cannon9c751b72009-03-09 16:28:16 +0000302 .. method:: write_bytecode(fullname, bytecode)
Brett Cannon2a922ed2009-03-09 03:35:50 +0000303
304 An abstract method which has the loader write *bytecode* for future
305 use. If the bytecode is written, return :keyword:`True`. Return
306 :keyword:`False` if the bytecode could not be written. This method
307 should not be called if :data:`sys.dont_write_bytecode` is true.
Guido van Rossum09613542009-03-30 20:34:57 +0000308 The *bytecode* argument should be a bytes string or bytes array.
Brett Cannon2a922ed2009-03-09 03:35:50 +0000309
310
Brett Cannon78246b62009-01-25 04:56:30 +0000311:mod:`importlib.machinery` -- Importers and path hooks
312------------------------------------------------------
313
314.. module:: importlib.machinery
315 :synopsis: Importers and path hooks
316
317This module contains the various objects that help :keyword:`import`
318find and load modules.
319
320.. class:: BuiltinImporter
321
Brett Cannon2a922ed2009-03-09 03:35:50 +0000322 An :term:`importer` for built-in modules. All known built-in modules are
323 listed in :data:`sys.builtin_module_names`. This class implements the
Brett Cannona113ac52009-03-15 01:41:33 +0000324 :class:`importlib.abc.Finder` and :class:`importlib.abc.InspectLoader`
325 ABCs.
Brett Cannon78246b62009-01-25 04:56:30 +0000326
327 Only class methods are defined by this class to alleviate the need for
328 instantiation.
329
Brett Cannon78246b62009-01-25 04:56:30 +0000330
331.. class:: FrozenImporter
332
Brett Cannon2a922ed2009-03-09 03:35:50 +0000333 An :term:`importer` for frozen modules. This class implements the
Brett Cannon8d110132009-03-15 02:20:16 +0000334 :class:`importlib.abc.Finder` and :class:`importlib.abc.InspectLoader`
335 ABCs.
Brett Cannon78246b62009-01-25 04:56:30 +0000336
337 Only class methods are defined by this class to alleviate the need for
338 instantiation.
339
Brett Cannondebb98d2009-02-16 04:18:01 +0000340
341.. class:: PathFinder
342
Brett Cannon2a922ed2009-03-09 03:35:50 +0000343 :term:`Finder` for :data:`sys.path`. This class implements the
344 :class:`importlib.abc.Finder` ABC.
Brett Cannondebb98d2009-02-16 04:18:01 +0000345
346 This class does not perfectly mirror the semantics of :keyword:`import` in
347 terms of :data:`sys.path`. No implicit path hooks are assumed for
348 simplification of the class and its semantics.
349
Brett Cannon1b184d52009-11-07 08:22:58 +0000350 Only class methods are defined by this class to alleviate the need for
Brett Cannondebb98d2009-02-16 04:18:01 +0000351 instantiation.
352
353 .. classmethod:: find_module(fullname, path=None)
354
355 Class method that attempts to find a :term:`loader` for the module
Brett Cannon2a922ed2009-03-09 03:35:50 +0000356 specified by *fullname* on :data:`sys.path` or, if defined, on
Brett Cannondebb98d2009-02-16 04:18:01 +0000357 *path*. For each path entry that is searched,
358 :data:`sys.path_importer_cache` is checked. If an non-false object is
Brett Cannon2a922ed2009-03-09 03:35:50 +0000359 found then it is used as the :term:`finder` to look for the module
360 being searched for. If no entry is found in
Brett Cannondebb98d2009-02-16 04:18:01 +0000361 :data:`sys.path_importer_cache`, then :data:`sys.path_hooks` is
362 searched for a finder for the path entry and, if found, is stored in
363 :data:`sys.path_importer_cache` along with being queried about the
Brett Cannon2a922ed2009-03-09 03:35:50 +0000364 module. If no finder is ever found then :keyword:`None` is returned.
Brett Cannond2e7b332009-02-17 02:45:03 +0000365
366
367:mod:`importlib.util` -- Utility code for importers
368---------------------------------------------------
369
370.. module:: importlib.util
371 :synopsis: Importers and path hooks
372
373This module contains the various objects that help in the construction of
374an :term:`importer`.
375
376.. function:: module_for_loader(method)
377
Guido van Rossum09613542009-03-30 20:34:57 +0000378 A :term:`decorator` for a :term:`loader` method,
379 to handle selecting the proper
Brett Cannond2e7b332009-02-17 02:45:03 +0000380 module object to load with. The decorated method is expected to have a call
Brett Cannon2a922ed2009-03-09 03:35:50 +0000381 signature taking two positional arguments
382 (e.g. ``load_module(self, module)``) for which the second argument
Guido van Rossum09613542009-03-30 20:34:57 +0000383 will be the module **object** to be used by the loader.
384 Note that the decorator
Brett Cannon57b46f52009-03-02 14:38:26 +0000385 will not work on static methods because of the assumption of two
Brett Cannon2a922ed2009-03-09 03:35:50 +0000386 arguments.
Brett Cannond2e7b332009-02-17 02:45:03 +0000387
Guido van Rossum09613542009-03-30 20:34:57 +0000388 The decorated method will take in the **name** of the module to be loaded
389 as expected for a :term:`loader`. If the module is not found in
Brett Cannon57b46f52009-03-02 14:38:26 +0000390 :data:`sys.modules` then a new one is constructed with its
391 :attr:`__name__` attribute set. Otherwise the module found in
392 :data:`sys.modules` will be passed into the method. If an
Brett Cannond2e7b332009-02-17 02:45:03 +0000393 exception is raised by the decorated method and a module was added to
394 :data:`sys.modules` it will be removed to prevent a partially initialized
Brett Cannon57b46f52009-03-02 14:38:26 +0000395 module from being in left in :data:`sys.modules`. If the module was already
396 in :data:`sys.modules` then it is left alone.
Brett Cannond2e7b332009-02-17 02:45:03 +0000397
Guido van Rossum09613542009-03-30 20:34:57 +0000398 Use of this decorator handles all the details of which module object a
Brett Cannon57b46f52009-03-02 14:38:26 +0000399 loader should initialize as specified by :pep:`302`.
400
Brett Cannon2cf03a82009-03-10 05:17:37 +0000401.. function:: set_loader(fxn)
402
Guido van Rossum09613542009-03-30 20:34:57 +0000403 A :term:`decorator` for a :term:`loader` method,
404 to set the :attr:`__loader__`
Brett Cannon2cf03a82009-03-10 05:17:37 +0000405 attribute on loaded modules. If the attribute is already set the decorator
406 does nothing. It is assumed that the first positional argument to the
407 wrapped method is what :attr:`__loader__` should be set to.
408
Brett Cannon2cf03a82009-03-10 05:17:37 +0000409.. function:: set_package(fxn)
Brett Cannon57b46f52009-03-02 14:38:26 +0000410
411 A :term:`decorator` for a :term:`loader` to set the :attr:`__package__`
412 attribute on the module returned by the loader. If :attr:`__package__` is
413 set and has a value other than :keyword:`None` it will not be changed.
414 Note that the module returned by the loader is what has the attribute
415 set on and not the module found in :data:`sys.modules`.
Guido van Rossum09613542009-03-30 20:34:57 +0000416
Brett Cannon16248a42009-04-01 20:47:14 +0000417 Reliance on this decorator is discouraged when it is possible to set
418 :attr:`__package__` before the execution of the code is possible. By
419 setting it before the code for the module is executed it allows the
420 attribute to be used at the global level of the module during
421 initialization.
422
Brett Cannon9f4cb1c2009-04-01 23:26:47 +0000423
424Example
425-------
426
Brett Cannonbc6c2b52009-04-01 23:36:48 +0000427Below is an example meta path importer that uses a dict for back-end storage
428for source code. While not an optimal solution -- manipulations of
429:attr:`__path__` on packages does not influence import -- it does illustrate
430what little is required to implement an importer.
431
Brett Cannon9f4cb1c2009-04-01 23:26:47 +0000432.. testcode::
433
434 """An importer where source is stored in a dict."""
435 from importlib import abc
436
437
438 class DictImporter(abc.Finder, abc.PyLoader):
439
440 """A meta path importer that stores source code in a dict.
441
442 The keys are the module names -- packages must end in ``.__init__``.
443 The values must be something that can be passed to 'bytes'.
444
445 """
446
447 def __init__(self, memory):
448 """Store the dict."""
449 self.memory = memory
450
451 def contains(self, name):
452 """See if a module or package is in the dict."""
453 if name in self.memory:
454 return name
455 package_name = '{}.__init__'.format(name)
456 if package_name in self.memory:
457 return package_name
458 return False
459
460 __contains__ = contains # Convenience.
461
462 def find_module(self, fullname, path=None):
463 """Find the module in the dict."""
464 if fullname in self:
465 return self
466 return None
467
468 def source_path(self, fullname):
469 """Return the module name if the module is in the dict."""
470 if not fullname in self:
471 raise ImportError
472 return fullname
473
474 def get_data(self, path):
475 """Return the bytes for the source.
476
477 The value found in the dict is passed through 'bytes' before being
478 returned.
479
480 """
481 name = self.contains(path)
482 if not name:
483 raise IOError
484 return bytes(self.memory[name])
485
486 def is_package(self, fullname):
487 """Tell if module is a package based on whether the dict contains the
488 name with ``.__init__`` appended to it."""
489 if fullname not in self:
490 raise ImportError
491 if fullname in self.memory:
492 return False
493 # If name is in this importer but not as it is then it must end in
494 # ``__init__``.
495 else:
496 return True
497
498.. testcode::
499 :hide:
500
501 import importlib
502 import sys
503
504
505 # Build the dict; keys of name, value of __package__.
506 names = {'_top_level': '', '_pkg.__init__': '_pkg', '_pkg.mod': '_pkg'}
507 source = {name: "name = {!r}".format(name).encode() for name in names}
508
509 # Register the meta path importer.
510 importer = DictImporter(source)
511 sys.meta_path.append(importer)
512
513 # Sanity check.
514 for name in names:
515 module = importlib.import_module(name)
516 assert module.__name__ == name
517 assert getattr(module, 'name') == name
518 assert module.__loader__ is importer
519 assert module.__package__ == names[name]