]> granicus.if.org Git - python/commitdiff
Fix importlib.machinery.PathFinder.find_module() to essentially skip over None
authorBrett Cannon <bcannon@gmail.com>
Mon, 30 Mar 2009 19:57:15 +0000 (19:57 +0000)
committerBrett Cannon <bcannon@gmail.com>
Mon, 30 Mar 2009 19:57:15 +0000 (19:57 +0000)
entries in sys.path_importer_cache. While this differs from semantics in how
__import__ works, it prevents any implicit semantics from taking hold with
users.

Lib/importlib/_bootstrap.py
Lib/importlib/test/import_/test_path.py

index d5b909e32f1bf36669deddae175594437f662089..949a612338fb5f4a0819cb3a4721275e0332f748 100644 (file)
@@ -661,9 +661,10 @@ class PathFinder:
                 finder = cls._path_importer_cache(entry)
             except ImportError:
                 continue
-            loader = finder.find_module(fullname)
-            if loader:
-                return loader
+            if finder:
+                loader = finder.find_module(fullname)
+                if loader:
+                    return loader
         else:
             return None
 
index 3d9b1a1ccd8e74d8173f955357932a2a5939ac5d..ede9b5f4c96ec8506c5c79536737c30fc7fac9a8 100644 (file)
@@ -55,6 +55,25 @@ class FinderTests(unittest.TestCase):
             self.assert_(path in sys.path_importer_cache)
             self.assert_(sys.path_importer_cache[path] is importer)
 
+    def test_path_importer_cache_has_None(self):
+        # Test that if sys.path_importer_cache has None that None is returned.
+        clear_cache = {path: None for path in sys.path}
+        with util.import_state(path_importer_cache=clear_cache):
+            for name in ('asynchat', 'sys', '<test module>'):
+                self.assert_(machinery.PathFinder.find_module(name) is None)
+
+    def test_path_importer_cache_has_None_continues(self):
+        # Test that having None in sys.path_importer_cache causes the search to
+        # continue.
+        path = '<test path>'
+        module = '<test module>'
+        importer = util.mock_modules(module)
+        with util.import_state(path=['1', '2'],
+                            path_importer_cache={'1': None, '2': importer}):
+            loader = machinery.PathFinder.find_module(module)
+            self.assert_(loader is importer)
+
+
 
 class DefaultPathFinderTests(unittest.TestCase):