summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2010-06-27 22:37:28 (GMT)
committerBenjamin Peterson <benjamin@python.org>2010-06-27 22:37:28 (GMT)
commit556d8001dfaf5c7d6b45d5d1e6d09ed7a410c8b3 (patch)
tree6f723b3a2c99ce2362d697fa0ded5167a9d5e3cb
parentd7c3ed54ef8ee248958ab5626465c70b9953f9de (diff)
downloadcpython-556d8001dfaf5c7d6b45d5d1e6d09ed7a410c8b3.zip
cpython-556d8001dfaf5c7d6b45d5d1e6d09ed7a410c8b3.tar.gz
cpython-556d8001dfaf5c7d6b45d5d1e6d09ed7a410c8b3.tar.bz2
Merged revisions 81380 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r81380 | brett.cannon | 2010-05-20 13:37:55 -0500 (Thu, 20 May 2010) | 8 lines Turned out that if you used explicit relative import syntax (e.g. from .os import sep) and it failed, import would still try the implicit relative import semantics of an absolute import (from os import sep). That's not right, so when level is negative, only do explicit relative import semantics. Fixes issue #7902. Thanks to Meador Inge for the patch. ........
-rw-r--r--Lib/test/test_import.py11
-rw-r--r--Python/import.c3
2 files changed, 13 insertions, 1 deletions
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index bf689ae..512759d 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -468,6 +468,17 @@ class RelativeImportTests(unittest.TestCase):
ns = dict(__package__=object())
self.assertRaises(ValueError, check_relative)
+ def test_absolute_import_without_future(self):
+ # If absolute import syntax is used, then do not try to perform
+ # a relative import in the face of failure.
+ # Issue #7902.
+ try:
+ from .os import sep
+ except ImportError:
+ pass
+ else:
+ self.fail("explicit relative import triggered an "
+ "implicit relative import")
class OverridingImportBuiltinTests(unittest.TestCase):
def test_override_builtin(self):
diff --git a/Python/import.c b/Python/import.c
index df00802..194e360 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2385,7 +2385,8 @@ import_module_level(char *name, PyObject *globals, PyObject *locals,
if (parent == NULL)
return NULL;
- head = load_next(parent, Py_None, &name, buf, &buflen);
+ head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
+ &buflen);
if (head == NULL)
return NULL;