Move importlib completely over to using rpartition and accepting the empty

string for top-level modules.
This commit is contained in:
Brett Cannon 2009-02-07 01:52:25 +00:00
parent d94e558fdc
commit 06c9d96b70
4 changed files with 22 additions and 15 deletions

View File

@ -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).

View File

@ -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

View File

@ -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)

View File

@ -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)