[Python-checkins] r83731 - in python/branches/py3k: Doc/library/functools.rst Lib/functools.py Lib/test/test_functools.py Misc/ACKS Misc/NEWS
antoine.pitrou
python-checkins at python.org
Wed Aug 4 20:28:02 CEST 2010
Author: antoine.pitrou
Date: Wed Aug 4 20:28:02 2010
New Revision: 83731
Log:
Issue #8814: function annotations (the `__annotations__` attribute)
are now included in the set of attributes copied by default by
functools.wraps and functools.update_wrapper. Patch by Terrence Cole.
Modified:
python/branches/py3k/Doc/library/functools.rst
python/branches/py3k/Lib/functools.py
python/branches/py3k/Lib/test/test_functools.py
python/branches/py3k/Misc/ACKS
python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Doc/library/functools.rst
==============================================================================
--- python/branches/py3k/Doc/library/functools.rst (original)
+++ python/branches/py3k/Doc/library/functools.rst Wed Aug 4 20:28:02 2010
@@ -165,9 +165,9 @@
attributes of the wrapper function are updated with the corresponding attributes
from the original function. The default values for these arguments are the
module level constants *WRAPPER_ASSIGNMENTS* (which assigns to the wrapper
- function's *__name__*, *__module__* and *__doc__*, the documentation string) and
- *WRAPPER_UPDATES* (which updates the wrapper function's *__dict__*, i.e. the
- instance dictionary).
+ function's *__name__*, *__module__*, *__annotations__* and *__doc__*, the
+ documentation string) and *WRAPPER_UPDATES* (which updates the wrapper
+ function's *__dict__*, i.e. the instance dictionary).
The main intended use for this function is in :term:`decorator` functions which
wrap the decorated function and return the wrapper. If the wrapper function is
Modified: python/branches/py3k/Lib/functools.py
==============================================================================
--- python/branches/py3k/Lib/functools.py (original)
+++ python/branches/py3k/Lib/functools.py Wed Aug 4 20:28:02 2010
@@ -19,7 +19,7 @@
# update_wrapper() and wraps() are tools to help write
# wrapper functions that can handle naive introspection
-WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
+WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__', '__annotations__')
WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper,
wrapped,
@@ -37,7 +37,8 @@
function (defaults to functools.WRAPPER_UPDATES)
"""
for attr in assigned:
- setattr(wrapper, attr, getattr(wrapped, attr))
+ if hasattr(wrapped, attr):
+ setattr(wrapper, attr, getattr(wrapped, attr))
for attr in updated:
getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
# Return the wrapper so this can be used as a decorator via partial()
Modified: python/branches/py3k/Lib/test/test_functools.py
==============================================================================
--- python/branches/py3k/Lib/test/test_functools.py (original)
+++ python/branches/py3k/Lib/test/test_functools.py Wed Aug 4 20:28:02 2010
@@ -182,11 +182,11 @@
self.assertTrue(wrapped_attr[key] is wrapper_attr[key])
def _default_update(self):
- def f():
+ def f(a:'This is a new annotation'):
"""This is a test"""
pass
f.attr = 'This is also a test'
- def wrapper():
+ def wrapper(b:'This is the prior annotation'):
pass
functools.update_wrapper(wrapper, f)
return wrapper, f
@@ -196,6 +196,8 @@
self.check_wrapper(wrapper, f)
self.assertEqual(wrapper.__name__, 'f')
self.assertEqual(wrapper.attr, 'This is also a test')
+ self.assertEqual(wrapper.__annotations__['a'], 'This is a new annotation')
+ self.assertNotIn('b', wrapper.__annotations__)
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
@@ -214,6 +216,7 @@
self.check_wrapper(wrapper, f, (), ())
self.assertEqual(wrapper.__name__, 'wrapper')
self.assertEqual(wrapper.__doc__, None)
+ self.assertEqual(wrapper.__annotations__, {})
self.assertFalse(hasattr(wrapper, 'attr'))
def test_selective_update(self):
@@ -240,6 +243,7 @@
functools.update_wrapper(wrapper, max)
self.assertEqual(wrapper.__name__, 'max')
self.assertTrue(wrapper.__doc__.startswith('max('))
+ self.assertEqual(wrapper.__annotations__, {})
class TestWraps(TestUpdateWrapper):
Modified: python/branches/py3k/Misc/ACKS
==============================================================================
--- python/branches/py3k/Misc/ACKS (original)
+++ python/branches/py3k/Misc/ACKS Wed Aug 4 20:28:02 2010
@@ -154,6 +154,7 @@
Nick Coghlan
Josh Cogliati
Dave Cole
+Terrence Cole
Benjamin Collar
Jeffery Collins
Robert Collins
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Wed Aug 4 20:28:02 2010
@@ -37,6 +37,10 @@
Library
-------
+- Issue #8814: function annotations (the ``__annotations__`` attribute)
+ are now included in the set of attributes copied by default by
+ functools.wraps and functools.update_wrapper. Patch by Terrence Cole.
+
- Issue #2944: asyncore doesn't handle connection refused correctly.
- Issue #4184: Private attributes on smtpd.SMTPChannel made public and
More information about the Python-checkins
mailing list