summaryrefslogtreecommitdiff
path: root/Lib/test
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-02-27 00:45:12 +0100
committerAntoine Pitrou <solipsis@pitrou.net>2012-02-27 00:45:12 +0100
commit6a1cd1b3b14e204468132605008f1ac62d12151c (patch)
treedbc165fa7f3e60aa2c63cef4c8a4551d2a7f61ea /Lib/test
parent92904d3a4aafa0437e2d614cef607cbf11860957 (diff)
downloadcpython-git-6a1cd1b3b14e204468132605008f1ac62d12151c.tar.gz
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/test')
-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 29167d0e38..18f7ce67ce 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: