[3.6] bpo-25794: Fix type.__setattr__() for non-interned attribute names. (GH-1652) (#1673)

Based on patch by Eryk Sun.
(cherry picked from commit d896985bb2)
This commit is contained in:
Serhiy Storchaka 2017-05-20 10:23:31 +03:00 committed by GitHub
parent 2773add19a
commit 193f7e094f
3 changed files with 64 additions and 5 deletions

View file

@ -568,5 +568,32 @@ class ClassTests(unittest.TestCase):
a = A(hash(A.f)^(-1))
hash(a.f)
def testSetattrWrapperNameIntern(self):
# Issue #25794: __setattr__ should intern the attribute name
class A:
pass
def add(self, other):
return 'summa'
name = str(b'__add__', 'ascii') # shouldn't be optimized
self.assertIsNot(name, '__add__') # not interned
type.__setattr__(A, name, add)
self.assertEqual(A() + 1, 'summa')
name2 = str(b'__add__', 'ascii')
self.assertIsNot(name2, '__add__')
self.assertIsNot(name2, name)
type.__delattr__(A, name2)
with self.assertRaises(TypeError):
A() + 1
def testSetattrNonStringName(self):
class A:
pass
with self.assertRaises(TypeError):
type.__setattr__(A, b'x', None)
if __name__ == '__main__':
unittest.main()