From 1c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sun, 30 Aug 2009 20:22:21 +0000 Subject: Trying to import a submodule from another module and not a package was raising AttributeError in importlib when it should be an ImportError. Found when running importlib against test_runpy. --- Lib/importlib/_bootstrap.py | 6 +++++- Lib/importlib/test/import_/test_packages.py | 6 ++++++ Lib/importlib/test/regrtest.py | 3 --- Misc/NEWS | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index bd62c36..466b287 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -879,7 +879,11 @@ def _gcd_import(name, package=None, level=0): _gcd_import(parent) # Backwards-compatibility; be nicer to skip the dict lookup. parent_module = sys.modules[parent] - path = parent_module.__path__ + try: + path = parent_module.__path__ + except AttributeError: + raise ImportError("no module named {}; " + "{} is not a package".format(name, parent)) meta_path = sys.meta_path + _IMPLICIT_META_PATH for finder in meta_path: loader = finder.find_module(name, path) diff --git a/Lib/importlib/test/import_/test_packages.py b/Lib/importlib/test/import_/test_packages.py index 1a15ebb..faadc32 100644 --- a/Lib/importlib/test/import_/test_packages.py +++ b/Lib/importlib/test/import_/test_packages.py @@ -21,6 +21,12 @@ class ParentModuleTests(unittest.TestCase): with self.assertRaises(ImportError): import_util.import_('pkg.module') + def test_module_not_package(self): + # Try to import a submodule from a non-package should raise ImportError. + assert not hasattr(sys, '__path__') + with self.assertRaises(ImportError): + import_util.import_('sys.no_submodules_here') + def test_main(): from test.support import run_unittest diff --git a/Lib/importlib/test/regrtest.py b/Lib/importlib/test/regrtest.py index ca27489..f9721c0 100644 --- a/Lib/importlib/test/regrtest.py +++ b/Lib/importlib/test/regrtest.py @@ -8,9 +8,6 @@ this script. XXX FAILING test_import # execution bit, exception name differing, file name differing between code and module (?) - test_runpy # Importing sys.imp.eric raises AttributeError instead of - ImportError (as does any attempt to import a sub-module - from a non-package, e.g. tokenize.menotreal) """ import importlib diff --git a/Misc/NEWS b/Misc/NEWS index 608e9a8..bc7f5b0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -68,6 +68,9 @@ C-API Library ------- +- Trying to import a submodule from a module that is not a package, ImportError + should be raised, not AttributeError. + - When the globals past to importlib.__import__() has __package__ set to None, fall back to computing what __package__ should be instead of giving up. -- cgit v0.12