summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2010-05-20 18:37:55 (GMT)
committerBrett Cannon <bcannon@gmail.com>2010-05-20 18:37:55 (GMT)
commiteb3cd301aea85de122c828afa6473bfc6c9eb10e (patch)
treea4d2c340158318d6d258e694ca87c3e38811a2fc
parentb1556c537d7c49978fa40594a9c9f40c6f88cdde (diff)
downloadcpython-eb3cd301aea85de122c828afa6473bfc6c9eb10e.zip
cpython-eb3cd301aea85de122c828afa6473bfc6c9eb10e.tar.gz
cpython-eb3cd301aea85de122c828afa6473bfc6c9eb10e.tar.bz2
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.py12
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/import.c3
3 files changed, 17 insertions, 1 deletions
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index f47c6c9..da4fe3b 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -431,6 +431,18 @@ class RelativeImportTests(unittest.TestCase):
self.assertRaises(ValueError, check_absolute)
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")
+
def test_main(verbose=None):
run_unittest(ImportTests, PycRewritingTests, PathsTests, RelativeImportTests)
diff --git a/Misc/NEWS b/Misc/NEWS
index b81eb70..1c4e174 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 Release Candidate 1?
Core and Builtins
-----------------
+- Issue #7902: When using explicit relative import syntax, don't try
+ implicit relative import semantics.
+
- Issue #7079: Fix a possible crash when closing a file object while using
it from another thread. Patch by Daniel Stutzbach.
diff --git a/Python/import.c b/Python/import.c
index 7abe679..990ee51 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2134,7 +2134,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;