mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Document and test the resolution of issue 3445 (tolerate missing attributes in functools.update_wrapper, previously implemented as a side effect of the __annotations__ copying patch) and implement issue 9567 (add a __wrapped__ attribute when using update_wrapper)
This commit is contained in:
parent
632a0c1476
commit
9887683f74
4 changed files with 65 additions and 2 deletions
|
|
@ -194,6 +194,7 @@ class TestUpdateWrapper(unittest.TestCase):
|
|||
def test_default_update(self):
|
||||
wrapper, f = self._default_update()
|
||||
self.check_wrapper(wrapper, f)
|
||||
self.assertIs(wrapper.__wrapped__, 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')
|
||||
|
|
@ -236,6 +237,28 @@ class TestUpdateWrapper(unittest.TestCase):
|
|||
self.assertEqual(wrapper.attr, 'This is a different test')
|
||||
self.assertEqual(wrapper.dict_attr, f.dict_attr)
|
||||
|
||||
def test_missing_attributes(self):
|
||||
def f():
|
||||
pass
|
||||
def wrapper():
|
||||
pass
|
||||
wrapper.dict_attr = {}
|
||||
assign = ('attr',)
|
||||
update = ('dict_attr',)
|
||||
# Missing attributes on wrapped object are ignored
|
||||
functools.update_wrapper(wrapper, f, assign, update)
|
||||
self.assertNotIn('attr', wrapper.__dict__)
|
||||
self.assertEqual(wrapper.dict_attr, {})
|
||||
# Wrapper must have expected attributes for updating
|
||||
del wrapper.dict_attr
|
||||
with self.assertRaises(AttributeError):
|
||||
functools.update_wrapper(wrapper, f, assign, update)
|
||||
wrapper.dict_attr = 1
|
||||
with self.assertRaises(AttributeError):
|
||||
functools.update_wrapper(wrapper, f, assign, update)
|
||||
|
||||
@unittest.skipIf(sys.flags.optimize >= 2,
|
||||
"Docstrings are omitted with -O2 and above")
|
||||
def test_builtin_update(self):
|
||||
# Test for bug #1576241
|
||||
def wrapper():
|
||||
|
|
@ -495,6 +518,12 @@ class TestLRU(unittest.TestCase):
|
|||
self.assertEqual(f.hits, 0)
|
||||
self.assertEqual(f.misses, 1)
|
||||
|
||||
# Test bypassing the cache
|
||||
self.assertIs(f.__wrapped__, orig)
|
||||
f.__wrapped__(x, y)
|
||||
self.assertEqual(f.hits, 0)
|
||||
self.assertEqual(f.misses, 1)
|
||||
|
||||
# test size zero (which means "never-cache")
|
||||
@functools.lru_cache(0)
|
||||
def f():
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue