diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-11-17 22:44:30 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-11-17 22:44:30 +0000 |
commit | 9adae2e7decfe738480e8cd0ec41bae95c053fc8 (patch) | |
tree | 6b5a6b215f7493beb4a6ddd2fec56d75441038c0 /Lib/test | |
parent | f9c0888f891d1cc2df00557985bcc86723dd4716 (diff) | |
download | cpython-git-9adae2e7decfe738480e8cd0ec41bae95c053fc8.tar.gz |
Merged revisions 67246 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67246 | benjamin.peterson | 2008-11-17 16:39:09 -0600 (Mon, 17 Nov 2008) | 5 lines
when __getattr__ is a descriptor, call it correctly; fixes #4230
patch from Ziga Seilnacht
........
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_descr.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index f74073811f..b57e0fae05 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4289,6 +4289,46 @@ order (MRO) for bases """ c[1:2] = 3 self.assertEqual(c.value, 3) + def test_getattr_hooks(self): + # issue 4230 + + class Descriptor(object): + counter = 0 + def __get__(self, obj, objtype=None): + def getter(name): + self.counter += 1 + raise AttributeError(name) + return getter + + descr = Descriptor() + class A(object): + __getattribute__ = descr + class B(object): + __getattr__ = descr + class C(object): + __getattribute__ = descr + __getattr__ = descr + + self.assertRaises(AttributeError, getattr, A(), "attr") + self.assertEquals(descr.counter, 1) + self.assertRaises(AttributeError, getattr, B(), "attr") + self.assertEquals(descr.counter, 2) + self.assertRaises(AttributeError, getattr, C(), "attr") + self.assertEquals(descr.counter, 4) + + import gc + class EvilGetattribute(object): + # This used to segfault + def __getattr__(self, name): + raise AttributeError(name) + def __getattribute__(self, name): + del EvilGetattribute.__getattr__ + for i in range(5): + gc.collect() + raise AttributeError(name) + + self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr") + class DictProxyTests(unittest.TestCase): def setUp(self): |