summaryrefslogtreecommitdiffstats
path: root/Lib/importlib
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2009-02-07 01:52:25 (GMT)
committerBrett Cannon <bcannon@gmail.com>2009-02-07 01:52:25 (GMT)
commit06c9d96b7033a70922851d7dfe23e74e73ddd287 (patch)
treef8e66db58a2fc1ed9508e45db64507a916130ab7 /Lib/importlib
parentd94e558fdc58d0a15545e858cc47eabe7ee7f38d (diff)
downloadcpython-06c9d96b7033a70922851d7dfe23e74e73ddd287.zip
cpython-06c9d96b7033a70922851d7dfe23e74e73ddd287.tar.gz
cpython-06c9d96b7033a70922851d7dfe23e74e73ddd287.tar.bz2
Move importlib completely over to using rpartition and accepting the empty
string for top-level modules.
Diffstat (limited to 'Lib/importlib')
-rw-r--r--Lib/importlib/NOTES5
-rw-r--r--Lib/importlib/_bootstrap.py27
-rw-r--r--Lib/importlib/test/extension/test_loader.py3
-rw-r--r--Lib/importlib/test/source/test_loader.py2
4 files changed, 22 insertions, 15 deletions
diff --git a/Lib/importlib/NOTES b/Lib/importlib/NOTES
index 05920ad..f0d8e43 100644
--- a/Lib/importlib/NOTES
+++ b/Lib/importlib/NOTES
@@ -1,10 +1,7 @@
to do
/////
-* Use rpartition for getting the package of a module.
-
- + Make sure there is a test for the empty string as acceptable for
- __package__.
+* Extract test_path_hooks constants into a util module for extension testing.
* Implement PEP 302 protocol for loaders (should just be a matter of testing).
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index bc50036..810f793 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -90,6 +90,18 @@ class closing:
self.obj.close()
+def set___package__(fxn):
+ """Set __package__ on the returned module."""
+ def wrapper(*args, **kwargs):
+ module = fxn(*args, **kwargs)
+ if not hasattr(module, '__package__') or module.__package__ is None:
+ module.__package__ = module.__name__
+ if not hasattr(module, '__path__'):
+ module.__package__ = module.__package__.rpartition('.')[0]
+ return module
+ return wrapper
+
+
class BuiltinImporter:
"""Meta path loader for built-in modules.
@@ -111,12 +123,12 @@ class BuiltinImporter:
return cls if imp.is_builtin(fullname) else None
@classmethod
+ @set___package__
def load_module(cls, fullname):
"""Load a built-in module."""
if fullname not in sys.builtin_module_names:
raise ImportError("{0} is not a built-in module".format(fullname))
module = imp.init_builtin(fullname)
- module.__package__ = ''
return module
@@ -135,14 +147,12 @@ class FrozenImporter:
return cls if imp.is_frozen(fullname) else None
@classmethod
+ @set___package__
def load_module(cls, fullname):
"""Load a frozen module."""
if cls.find_module(fullname) is None:
raise ImportError("{0} is not a frozen module".format(fullname))
module = imp.init_frozen(fullname)
- module.__package__ = module.__name__
- if not hasattr(module, '__path__'):
- module.__package__ = module.__package__.rpartition('.')[0]
return module
@@ -230,6 +240,7 @@ class _ExtensionFileLoader(object):
raise ValueError("extension modules cannot be packages")
@check_name
+ @set___package__
def load_module(self, fullname):
"""Load an extension module."""
assert self._name == fullname
@@ -368,11 +379,9 @@ class _PyFileLoader(object):
module.__loader__ = self
if self._is_pkg:
module.__path__ = [module.__file__.rsplit(path_sep, 1)[0]]
- module.__package__ = module.__name__
- elif '.' in module.__name__:
- module.__package__ = module.__name__.rsplit('.', 1)[0]
- else:
- module.__package__ = None
+ module.__package__ = module.__name__
+ if not hasattr(module, '__path__'):
+ module.__package__ = module.__package__.rpartition('.')[0]
exec(code_object, module.__dict__)
return module
diff --git a/Lib/importlib/test/extension/test_loader.py b/Lib/importlib/test/extension/test_loader.py
index 1e43fdd..01f3426 100644
--- a/Lib/importlib/test/extension/test_loader.py
+++ b/Lib/importlib/test/extension/test_loader.py
@@ -21,7 +21,8 @@ class LoaderTests(abc.LoaderTests):
with util.uncache(test_path_hook.NAME):
module = self.load_module(test_path_hook.NAME)
for attr, value in [('__name__', test_path_hook.NAME),
- ('__file__', test_path_hook.FILEPATH)]:
+ ('__file__', test_path_hook.FILEPATH),
+ ('__package__', '')]:
self.assertEqual(getattr(module, attr), value)
self.assert_(test_path_hook.NAME in sys.modules)
diff --git a/Lib/importlib/test/source/test_loader.py b/Lib/importlib/test/source/test_loader.py
index e333b85..4ca9af1 100644
--- a/Lib/importlib/test/source/test_loader.py
+++ b/Lib/importlib/test/source/test_loader.py
@@ -23,7 +23,7 @@ class SimpleTest(unittest.TestCase):
module = loader.load_module('_temp')
self.assert_('_temp' in sys.modules)
check = {'__name__': '_temp', '__file__': mapping['_temp'],
- '__package__': None}
+ '__package__': ''}
for attr, value in check.items():
self.assertEqual(getattr(module, attr), value)