diff Lib/importlib/_bootstrap.py @ 52115:afd7118c8ccf

Implement importlib.util.set_loader: a decorator to automatically set __loader__ on modules.
author Brett Cannon <bcannon@gmail.com>
date Tue, 10 Mar 2009 05:17:37 +0000
parents 03080fa08dfe
children 2e8e897a1244
line wrap: on
line diff
--- a/Lib/importlib/_bootstrap.py	Tue Mar 10 03:29:23 2009 +0000
+++ b/Lib/importlib/_bootstrap.py	Tue Mar 10 05:17:37 2009 +0000
@@ -110,6 +110,17 @@
     return wrapper
 
 
+def set_loader(fxn):
+    """Set __loader__ on the returned module."""
+    def wrapper(self, *args, **kwargs):
+        module = fxn(self, *args, **kwargs)
+        if not hasattr(module, '__loader__'):
+            module.__loader__ = self
+        return module
+    wrap(wrapper, fxn)
+    return wrapper
+
+
 class BuiltinImporter:
 
     """Meta path loader for built-in modules.
@@ -132,6 +143,7 @@
 
     @classmethod
     @set_package
+    @set_loader
     def load_module(cls, fullname):
         """Load a built-in module."""
         if fullname not in sys.builtin_module_names:
@@ -161,6 +173,7 @@
 
     @classmethod
     @set_package
+    @set_loader
     def load_module(cls, fullname):
         """Load a frozen module."""
         if cls.find_module(fullname) is None:
@@ -249,13 +262,12 @@
 
     @check_name
     @set_package
+    @set_loader
     def load_module(self, fullname):
         """Load an extension module."""
         is_reload = fullname in sys.modules
         try:
-            module = imp.load_dynamic(fullname, self._path)
-            module.__loader__ = self
-            return module
+            return imp.load_dynamic(fullname, self._path)
         except:
             if not is_reload and fullname in sys.modules:
                 del sys.modules[fullname]