]> granicus.if.org Git - python/commitdiff
Issue #14710: Fix both pkgutil.find_loader() and get_loader() to not
authorBrett Cannon <brett@python.org>
Fri, 23 May 2014 16:30:37 +0000 (12:30 -0400)
committerBrett Cannon <brett@python.org>
Fri, 23 May 2014 16:30:37 +0000 (12:30 -0400)
raise an exception when a module doesn't exist.

Thanks to Pavel Aslanov for the bug report.

Lib/pkgutil.py
Lib/test/test_pkgutil.py
Misc/NEWS

index e42b6eb71f6b12edbaef993591658fdb98ec6e08..a54e9474d5bbb2bcd67a81a4dd7ad937f4b98fbd 100644 (file)
@@ -456,6 +456,8 @@ def get_loader(module_or_name):
     """
     if module_or_name in sys.modules:
         module_or_name = sys.modules[module_or_name]
+        if module_or_name is None:
+            return None
     if isinstance(module_or_name, ModuleType):
         module = module_or_name
         loader = getattr(module, '__loader__', None)
@@ -487,7 +489,7 @@ def find_loader(fullname):
         # pkgutil previously raised ImportError
         msg = "Error while finding loader for {!r} ({}: {})"
         raise ImportError(msg.format(fullname, type(ex), ex)) from ex
-    return spec.loader
+    return spec.loader if spec is not None else None
 
 
 def extend_path(path, name):
index 9704156a524e3983a5dfa18a5925da678e4ef736..e0c8635de1675a99ba58c5530d42b5469b784952 100644 (file)
@@ -363,6 +363,20 @@ class ImportlibMigrationTests(unittest.TestCase):
             loader = pkgutil.get_loader(name)
         self.assertIsNone(loader)
 
+    def test_get_loader_None_in_sys_modules(self):
+        name = 'totally bogus'
+        sys.modules[name] = None
+        try:
+            loader = pkgutil.get_loader(name)
+        finally:
+            del sys.modules[name]
+        self.assertIsNone(loader)
+
+    def test_find_loader_missing_module(self):
+        name = 'totally bogus'
+        loader = pkgutil.find_loader(name)
+        self.assertIsNone(loader)
+
     def test_find_loader_avoids_emulation(self):
         with check_warnings() as w:
             self.assertIsNotNone(pkgutil.find_loader("sys"))
index 6bee579ba983295cb4d35504e583c3c9db3e6dc7..cb99d561929f2088385ff21033bfa6b5d6f43c62 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,12 @@ Core and Builtins
 Library
 -------
 
+- Issue #14710: pkgutil.get_loader() no longer raises an exception when None is
+  found in sys.modules.
+
+- Issue #14710: pkgutil.find_loader() no longer raises an exception when a
+  module doesn't exist.
+
 - Issue #21538: The plistlib module now supports loading of binary plist files
   when reference or offset size is not a power of two.