diff --git a/Lib/importlib/NOTES b/Lib/importlib/NOTES index e1ec98d19f441d..a9f0c175ae7e05 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 810f793ff186c3..54e2f9de3bce71 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -90,6 +90,13 @@ def __exit__(self, *args): 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 wrapper(*args, **kwargs): if not hasattr(module, '__path__'): module.__package__ = module.__package__.rpartition('.')[0] return module + wrap(wrapper, fxn) return wrapper @@ -213,9 +221,7 @@ def inner(self, name, *args, **kwargs): 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 decorated(self, fullname): elif hasattr(module, attr): delattr(module, attr) raise + wrap(decorated, fxn) return decorated