Issue #26896: Disambiguate uses of "importer" with "finder".

Thanks to Oren Milman for the patch.
This commit is contained in:
Brett Cannon 2016-07-08 11:00:00 -07:00
parent 15552c39e0
commit fdcdd9ed80
9 changed files with 32 additions and 32 deletions

View File

@ -207,13 +207,13 @@ Importing Modules
.. c:function:: PyObject* PyImport_GetImporter(PyObject *path) .. c:function:: PyObject* PyImport_GetImporter(PyObject *path)
Return an importer object for a :data:`sys.path`/:attr:`pkg.__path__` item Return a finder object for a :data:`sys.path`/:attr:`pkg.__path__` item
*path*, possibly by fetching it from the :data:`sys.path_importer_cache` *path*, possibly by fetching it from the :data:`sys.path_importer_cache`
dict. If it wasn't yet cached, traverse :data:`sys.path_hooks` until a hook dict. If it wasn't yet cached, traverse :data:`sys.path_hooks` until a hook
is found that can handle the path item. Return ``None`` if no hook could; is found that can handle the path item. Return ``None`` if no hook could;
this tells our caller it should fall back to the built-in import mechanism. this tells our caller that the :term:`path based finder` could not find a
Cache the result in :data:`sys.path_importer_cache`. Return a new reference finder for this path item. Cache the result in :data:`sys.path_importer_cache`.
to the importer object. Return a new reference to the finder object.
.. c:function:: void _PyImport_Init() .. c:function:: void _PyImport_Init()

View File

@ -46,10 +46,10 @@ support.
.. class:: ImpImporter(dirname=None) .. class:: ImpImporter(dirname=None)
:pep:`302` Importer that wraps Python's "classic" import algorithm. :pep:`302` Finder that wraps Python's "classic" import algorithm.
If *dirname* is a string, a :pep:`302` importer is created that searches that If *dirname* is a string, a :pep:`302` finder is created that searches that
directory. If *dirname* is ``None``, a :pep:`302` importer is created that directory. If *dirname* is ``None``, a :pep:`302` finder is created that
searches the current :data:`sys.path`, plus any modules that are frozen or searches the current :data:`sys.path`, plus any modules that are frozen or
built-in. built-in.
@ -88,9 +88,9 @@ support.
.. function:: get_importer(path_item) .. function:: get_importer(path_item)
Retrieve a :pep:`302` importer for the given *path_item*. Retrieve a :pep:`302` finder for the given *path_item*.
The returned importer is cached in :data:`sys.path_importer_cache` if it was The returned finder is cached in :data:`sys.path_importer_cache` if it was
newly created by a path hook. newly created by a path hook.
The cache (or part of it) can be cleared manually if a rescan of The cache (or part of it) can be cleared manually if a rescan of
@ -121,16 +121,16 @@ support.
.. function:: iter_importers(fullname='') .. function:: iter_importers(fullname='')
Yield :pep:`302` importers for the given module name. Yield :pep:`302` finders for the given module name.
If fullname contains a '.', the importers will be for the package If fullname contains a '.', the finders will be for the package
containing fullname, otherwise they will be all registered top level containing fullname, otherwise they will be all registered top level
importers (i.e. those on both sys.meta_path and sys.path_hooks). finders (i.e. those on both sys.meta_path and sys.path_hooks).
If the named module is in a package, that package is imported as a side If the named module is in a package, that package is imported as a side
effect of invoking this function. effect of invoking this function.
If no module name is specified, all top level importers are produced. If no module name is specified, all top level finders are produced.
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Updated to be based directly on :mod:`importlib` rather than relying Updated to be based directly on :mod:`importlib` rather than relying

View File

@ -45,7 +45,7 @@ def read_code(stream):
def walk_packages(path=None, prefix='', onerror=None): def walk_packages(path=None, prefix='', onerror=None):
"""Yields (module_loader, name, ispkg) for all modules recursively """Yields (module_finder, name, ispkg) for all modules recursively
on path, or, if path is None, all accessible modules. on path, or, if path is None, all accessible modules.
'path' should be either None or a list of paths to look for 'path' should be either None or a list of paths to look for
@ -102,7 +102,7 @@ def walk_packages(path=None, prefix='', onerror=None):
def iter_modules(path=None, prefix=''): def iter_modules(path=None, prefix=''):
"""Yields (module_loader, name, ispkg) for all submodules on path, """Yields (module_finder, name, ispkg) for all submodules on path,
or, if path is None, all top-level modules on sys.path. or, if path is None, all top-level modules on sys.path.
'path' should be either None or a list of paths to look for 'path' should be either None or a list of paths to look for
@ -184,10 +184,10 @@ def _import_imp():
imp = importlib.import_module('imp') imp = importlib.import_module('imp')
class ImpImporter: class ImpImporter:
"""PEP 302 Importer that wraps Python's "classic" import algorithm """PEP 302 Finder that wraps Python's "classic" import algorithm
ImpImporter(dirname) produces a PEP 302 importer that searches that ImpImporter(dirname) produces a PEP 302 finder that searches that
directory. ImpImporter(None) produces a PEP 302 importer that searches directory. ImpImporter(None) produces a PEP 302 finder that searches
the current sys.path, plus any modules that are frozen or built-in. the current sys.path, plus any modules that are frozen or built-in.
Note that ImpImporter does not currently support being used by placement Note that ImpImporter does not currently support being used by placement
@ -395,9 +395,9 @@ except ImportError:
def get_importer(path_item): def get_importer(path_item):
"""Retrieve a PEP 302 importer for the given path item """Retrieve a PEP 302 finder for the given path item
The returned importer is cached in sys.path_importer_cache The returned finder is cached in sys.path_importer_cache
if it was newly created by a path hook. if it was newly created by a path hook.
The cache (or part of it) can be cleared manually if a The cache (or part of it) can be cleared manually if a
@ -419,16 +419,16 @@ def get_importer(path_item):
def iter_importers(fullname=""): def iter_importers(fullname=""):
"""Yield PEP 302 importers for the given module name """Yield PEP 302 finders for the given module name
If fullname contains a '.', the importers will be for the package If fullname contains a '.', the finders will be for the package
containing fullname, otherwise they will be all registered top level containing fullname, otherwise they will be all registered top level
importers (i.e. those on both sys.meta_path and sys.path_hooks). finders (i.e. those on both sys.meta_path and sys.path_hooks).
If the named module is in a package, that package is imported as a side If the named module is in a package, that package is imported as a side
effect of invoking this function. effect of invoking this function.
If no module name is specified, all top level importers are produced. If no module name is specified, all top level finders are produced.
""" """
if fullname.startswith('.'): if fullname.startswith('.'):
msg = "Relative module name {!r} not supported".format(fullname) msg = "Relative module name {!r} not supported".format(fullname)

View File

@ -98,7 +98,7 @@ def _run_module_code(code, init_globals=None,
# may be cleared when the temporary module goes away # may be cleared when the temporary module goes away
return mod_globals.copy() return mod_globals.copy()
# Helper to get the loader, code and filename for a module # Helper to get the full name, spec and code for a module
def _get_module_details(mod_name, error=ImportError): def _get_module_details(mod_name, error=ImportError):
if mod_name.startswith("."): if mod_name.startswith("."):
raise error("Relative module names not supported") raise error("Relative module names not supported")
@ -253,7 +253,7 @@ def run_path(path_name, init_globals=None, run_name=None):
return _run_module_code(code, init_globals, run_name, return _run_module_code(code, init_globals, run_name,
pkg_name=pkg_name, script_name=fname) pkg_name=pkg_name, script_name=fname)
else: else:
# Importer is defined for path, so add it to # Finder is defined for path, so add it to
# the start of sys.path # the start of sys.path
sys.path.insert(0, path_name) sys.path.insert(0, path_name)
try: try:

View File

@ -76,7 +76,6 @@ class CallSignature:
self.__import__(mod_name) self.__import__(mod_name)
assert len(log) == 1 assert len(log) == 1
args = log[0][0] args = log[0][0]
kwargs = log[0][1]
# Assuming all arguments are positional. # Assuming all arguments are positional.
self.assertEqual(args[0], mod_name) self.assertEqual(args[0], mod_name)
self.assertIsNone(args[1]) self.assertIsNone(args[1])

View File

@ -266,7 +266,6 @@ class mock_spec(_ImporterMock):
module = self.modules[fullname] module = self.modules[fullname]
except KeyError: except KeyError:
return None return None
is_package = hasattr(module, '__path__')
spec = util.spec_from_file_location( spec = util.spec_from_file_location(
fullname, module.__file__, loader=self, fullname, module.__file__, loader=self,
submodule_search_locations=getattr(module, '__path__', None)) submodule_search_locations=getattr(module, '__path__', None))

View File

@ -205,7 +205,7 @@ class PkgutilPEP302Tests(unittest.TestCase):
del sys.meta_path[0] del sys.meta_path[0]
def test_getdata_pep302(self): def test_getdata_pep302(self):
# Use a dummy importer/loader # Use a dummy finder/loader
self.assertEqual(pkgutil.get_data('foo', 'dummy'), "Hello, world!") self.assertEqual(pkgutil.get_data('foo', 'dummy'), "Hello, world!")
del sys.modules['foo'] del sys.modules['foo']

View File

@ -998,6 +998,7 @@ Damien Miller
Jason V. Miller Jason V. Miller
Jay T. Miller Jay T. Miller
Katie Miller Katie Miller
Oren Milman
Roman Milner Roman Milner
Julien Miotte Julien Miotte
Andrii V. Mishkovskyi Andrii V. Mishkovskyi

View File

@ -950,12 +950,13 @@ is_builtin(PyObject *name)
} }
/* Return an importer object for a sys.path/pkg.__path__ item 'p', /* Return a finder object for a sys.path/pkg.__path__ item 'p',
possibly by fetching it from the path_importer_cache dict. If it possibly by fetching it from the path_importer_cache dict. If it
wasn't yet cached, traverse path_hooks until a hook is found wasn't yet cached, traverse path_hooks until a hook is found
that can handle the path item. Return None if no hook could; that can handle the path item. Return None if no hook could;
this tells our caller it should fall back to the builtin this tells our caller that the path based finder could not find
import mechanism. Cache the result in path_importer_cache. a finder for this path item. Cache the result in
path_importer_cache.
Returns a borrowed reference. */ Returns a borrowed reference. */
static PyObject * static PyObject *