summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2009-08-30 20:22:21 (GMT)
committerBrett Cannon <bcannon@gmail.com>2009-08-30 20:22:21 (GMT)
commit1c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19 (patch)
treef5c9b6ba568ea86b2c0d29c79021ca050b2e7bfd
parent82a23fe3925245086460eb7da95bbdc39cd2454a (diff)
downloadcpython-1c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19.zip
cpython-1c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19.tar.gz
cpython-1c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19.tar.bz2
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.
-rw-r--r--Lib/importlib/_bootstrap.py6
-rw-r--r--Lib/importlib/test/import_/test_packages.py6
-rw-r--r--Lib/importlib/test/regrtest.py3
-rw-r--r--Misc/NEWS3
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.