[Bug #1576241] Let functools.wraps work with built-in functions
diff --git a/Lib/functools.py b/Lib/functools.py
index 8783f08..9643036 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -32,7 +32,7 @@
for attr in assigned:
setattr(wrapper, attr, getattr(wrapped, attr))
for attr in updated:
- getattr(wrapper, attr).update(getattr(wrapped, attr))
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
# Return the wrapper so this can be used as a decorator via partial()
return wrapper
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 8dc185b..6012f9f 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -210,6 +210,13 @@
self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr)
+ def test_builtin_update(self):
+ # Test for bug #1576241
+ def wrapper():
+ pass
+ functools.update_wrapper(wrapper, max)
+ self.assertEqual(wrapper.__name__, 'max')
+ self.assert_(wrapper.__doc__.startswith('max('))
class TestWraps(TestUpdateWrapper):
diff --git a/Misc/NEWS b/Misc/NEWS
index a1033bf..13f52a7 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -105,6 +105,8 @@
- Bug #1565661: in webbrowser, split() the command for the default
GNOME browser in case it is a command with args.
+- Bug #1576241: fix functools.wraps() to work on built-in functions.
+
- Fix a bug in traceback.format_exception_only() that led to an error
being raised when print_exc() was called without an exception set.
In version 2.4, this printed "None", restored that behavior.