Commit ff7f64ca authored by Meador Inge's avatar Meador Inge

Issue #13544: Add __qualname__ to functools.WRAPPER_ASSIGNMENTS.

Patch by Filip Gruszczyński.
parent bf6e560d
...@@ -21,7 +21,8 @@ except: ...@@ -21,7 +21,8 @@ except:
# update_wrapper() and wraps() are tools to help write # update_wrapper() and wraps() are tools to help write
# wrapper functions that can handle naive introspection # wrapper functions that can handle naive introspection
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__', '__annotations__') WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
'__annotations__')
WRAPPER_UPDATES = ('__dict__',) WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper, def update_wrapper(wrapper,
wrapped, wrapped,
......
...@@ -226,6 +226,7 @@ class TestUpdateWrapper(unittest.TestCase): ...@@ -226,6 +226,7 @@ class TestUpdateWrapper(unittest.TestCase):
self.check_wrapper(wrapper, f) self.check_wrapper(wrapper, f)
self.assertIs(wrapper.__wrapped__, f) self.assertIs(wrapper.__wrapped__, f)
self.assertEqual(wrapper.__name__, 'f') self.assertEqual(wrapper.__name__, 'f')
self.assertEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.attr, 'This is also a test') self.assertEqual(wrapper.attr, 'This is also a test')
self.assertEqual(wrapper.__annotations__['a'], 'This is a new annotation') self.assertEqual(wrapper.__annotations__['a'], 'This is a new annotation')
self.assertNotIn('b', wrapper.__annotations__) self.assertNotIn('b', wrapper.__annotations__)
...@@ -246,6 +247,7 @@ class TestUpdateWrapper(unittest.TestCase): ...@@ -246,6 +247,7 @@ class TestUpdateWrapper(unittest.TestCase):
functools.update_wrapper(wrapper, f, (), ()) functools.update_wrapper(wrapper, f, (), ())
self.check_wrapper(wrapper, f, (), ()) self.check_wrapper(wrapper, f, (), ())
self.assertEqual(wrapper.__name__, 'wrapper') self.assertEqual(wrapper.__name__, 'wrapper')
self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None) self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.__annotations__, {}) self.assertEqual(wrapper.__annotations__, {})
self.assertFalse(hasattr(wrapper, 'attr')) self.assertFalse(hasattr(wrapper, 'attr'))
...@@ -263,6 +265,7 @@ class TestUpdateWrapper(unittest.TestCase): ...@@ -263,6 +265,7 @@ class TestUpdateWrapper(unittest.TestCase):
functools.update_wrapper(wrapper, f, assign, update) functools.update_wrapper(wrapper, f, assign, update)
self.check_wrapper(wrapper, f, assign, update) self.check_wrapper(wrapper, f, assign, update)
self.assertEqual(wrapper.__name__, 'wrapper') self.assertEqual(wrapper.__name__, 'wrapper')
self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None) self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.attr, 'This is a different test') self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr) self.assertEqual(wrapper.dict_attr, f.dict_attr)
...@@ -309,17 +312,18 @@ class TestWraps(TestUpdateWrapper): ...@@ -309,17 +312,18 @@ class TestWraps(TestUpdateWrapper):
def wrapper(): def wrapper():
pass pass
self.check_wrapper(wrapper, f) self.check_wrapper(wrapper, f)
return wrapper return wrapper, f
def test_default_update(self): def test_default_update(self):
wrapper = self._default_update() wrapper, f = self._default_update()
self.assertEqual(wrapper.__name__, 'f') self.assertEqual(wrapper.__name__, 'f')
self.assertEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.attr, 'This is also a test') self.assertEqual(wrapper.attr, 'This is also a test')
@unittest.skipIf(not sys.flags.optimize <= 1, @unittest.skipIf(not sys.flags.optimize <= 1,
"Docstrings are omitted with -O2 and above") "Docstrings are omitted with -O2 and above")
def test_default_update_doc(self): def test_default_update_doc(self):
wrapper = self._default_update() wrapper, _ = self._default_update()
self.assertEqual(wrapper.__doc__, 'This is a test') self.assertEqual(wrapper.__doc__, 'This is a test')
def test_no_update(self): def test_no_update(self):
...@@ -332,6 +336,7 @@ class TestWraps(TestUpdateWrapper): ...@@ -332,6 +336,7 @@ class TestWraps(TestUpdateWrapper):
pass pass
self.check_wrapper(wrapper, f, (), ()) self.check_wrapper(wrapper, f, (), ())
self.assertEqual(wrapper.__name__, 'wrapper') self.assertEqual(wrapper.__name__, 'wrapper')
self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None) self.assertEqual(wrapper.__doc__, None)
self.assertFalse(hasattr(wrapper, 'attr')) self.assertFalse(hasattr(wrapper, 'attr'))
...@@ -351,6 +356,7 @@ class TestWraps(TestUpdateWrapper): ...@@ -351,6 +356,7 @@ class TestWraps(TestUpdateWrapper):
pass pass
self.check_wrapper(wrapper, f, assign, update) self.check_wrapper(wrapper, f, assign, update)
self.assertEqual(wrapper.__name__, 'wrapper') self.assertEqual(wrapper.__name__, 'wrapper')
self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None) self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.attr, 'This is a different test') self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr) self.assertEqual(wrapper.dict_attr, f.dict_attr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment