From: Brett Cannon Date: Sat, 7 Feb 2009 02:13:28 +0000 (+0000) Subject: Create a simple substitute for functools.wraps to use in importlib._bootstrap. X-Git-Tag: v3.1a1~245 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51d8bfc8373d4275dfbf7ff24b2d594d753d9e1f;p=python Create a simple substitute for functools.wraps to use in importlib._bootstrap. --- diff --git a/Lib/importlib/NOTES b/Lib/importlib/NOTES index e1ec98d19f..a9f0c175ae 100644 --- a/Lib/importlib/NOTES +++ b/Lib/importlib/NOTES @@ -1,8 +1,6 @@ to do ///// -* Backport a poor-man's functools.wraps. - * Implement PEP 302 protocol for loaders (should just be a matter of testing). + Built-in. diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 810f793ff1..54e2f9de3b 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -90,6 +90,13 @@ class closing: self.obj.close() +def wrap(new, old): + """Simple substitute for functools.wraps.""" + for replace in ['__module__', '__name__', '__doc__']: + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + + def set___package__(fxn): """Set __package__ on the returned module.""" def wrapper(*args, **kwargs): @@ -99,6 +106,7 @@ def set___package__(fxn): if not hasattr(module, '__path__'): module.__package__ = module.__package__.rpartition('.')[0] return module + wrap(wrapper, fxn) return wrapper @@ -213,9 +221,7 @@ def check_name(method): if self._name != name: raise ImportError("loader cannot handle %s" % name) return method(self, name, *args, **kwargs) - inner.__name__ = method.__name__ - inner.__doc__ = method.__doc__ - inner.__dict__.update(method.__dict__) + wrap(inner, method) return inner @@ -318,6 +324,7 @@ def get_module(fxn): elif hasattr(module, attr): delattr(module, attr) raise + wrap(decorated, fxn) return decorated