]> granicus.if.org Git - python/commitdiff
Merged revisions 81380 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Sun, 27 Jun 2010 22:37:28 +0000 (22:37 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sun, 27 Jun 2010 22:37:28 +0000 (22:37 +0000)
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.
........

Lib/test/test_import.py
Python/import.c

index bf689aea4ceac3af311b567947dbea1162de9e11..512759d318d3811a0ecd44205e0264b0fb5a0e5c 100644 (file)
@@ -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):
index df00802d1a0bbc7bf2e6b21db86bf34d9ad8b8e6..194e360562c0be31d35ea21f5b5ddbc7080a4abf 100644 (file)
@@ -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;