summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-02-26 23:45:12 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2012-02-26 23:45:12 (GMT)
commite965d97ed1adac6a9a5cf69f04770249589756c7 (patch)
tree71a3cc64dc94f6f46cda51a662b95510c05e7819 /Lib
parent3bbdc8e822b483fdfb66e0422e94630af10d1b80 (diff)
downloadcpython-e965d97ed1adac6a9a5cf69f04770249589756c7.zip
cpython-e965d97ed1adac6a9a5cf69f04770249589756c7.tar.gz
cpython-e965d97ed1adac6a9a5cf69f04770249589756c7.tar.bz2
Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes.
Patch by Filip GruszczyƄski.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_dict.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index 1507e42..d2740a3 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -299,6 +299,26 @@ class DictTest(unittest.TestCase):
x.fail = True
self.assertRaises(Exc, d.setdefault, x, [])
+ def test_setdefault_atomic(self):
+ # Issue #13521: setdefault() calls __hash__ and __eq__ only once.
+ class Hashed(object):
+ def __init__(self):
+ self.hash_count = 0
+ self.eq_count = 0
+ def __hash__(self):
+ self.hash_count += 1
+ return 42
+ def __eq__(self, other):
+ self.eq_count += 1
+ return id(self) == id(other)
+ hashed1 = Hashed()
+ y = {hashed1: 5}
+ hashed2 = Hashed()
+ y.setdefault(hashed2, [])
+ self.assertEqual(hashed1.hash_count, 1)
+ self.assertEqual(hashed2.hash_count, 1)
+ self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1)
+
def test_popitem(self):
# dict.popitem()
for copymode in -1, +1: