Skip to content

Commit 5804f0c

Browse files
committed
Change Map.delete(key): raise a KeyError if key is not in the map
1 parent 451a848 commit 5804f0c

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

immutables/_map.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,8 +2355,8 @@ map_without(MapObject *o, PyObject *key)
23552355
case W_EMPTY:
23562356
return map_new();
23572357
case W_NOT_FOUND:
2358-
Py_INCREF(o);
2359-
return o;
2358+
PyErr_SetObject(PyExc_KeyError, key);
2359+
return NULL;
23602360
case W_NEWNODE: {
23612361
assert(new_root != NULL);
23622362

immutables/map.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def find(self, shift, hash, key):
126126
if key == key_or_null:
127127
return val_or_node
128128

129-
raise KeyError
129+
raise KeyError(key)
130130

131131
def without(self, shift, hash, key):
132132
bit = map_bitpos(hash, shift)
@@ -240,7 +240,7 @@ def find(self, shift, hash, key):
240240
for i in range(0, self.size, 2):
241241
if self.array[i] == key:
242242
return self.array[i + 1]
243-
raise KeyError
243+
raise KeyError(key)
244244

245245
def assoc(self, shift, hash, key, val, added_leaf):
246246
if hash == self.hash:
@@ -388,8 +388,7 @@ def delete(self, key):
388388
if res is W_EMPTY:
389389
return Map()
390390
elif res is W_NOT_FOUND:
391-
# raise KeyError(key)
392-
return self
391+
raise KeyError(key)
393392
else:
394393
m = Map.__new__(Map)
395394
m.__count = self.__count - 1

tests/test_map.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,10 @@ def test_map_stress(self):
269269
self.assertEqual(len(dm), len(hm))
270270

271271
for i, key in enumerate(keys_to_delete):
272-
hm = hm.delete(str(key))
272+
if str(key) in dm:
273+
hm = hm.delete(str(key))
274+
dm.pop(str(key))
273275
self.assertEqual(hm.get(str(key), 'not found'), 'not found')
274-
dm.pop(str(key), None)
275276
self.assertEqual(len(d), len(h))
276277

277278
if not (i % TEST_ITERS_EVERY):
@@ -317,8 +318,9 @@ def test_map_delete_1(self):
317318
h = h.delete(D)
318319
self.assertEqual(len(h), orig_len - 2)
319320

320-
h2 = h.delete(Z)
321-
self.assertIs(h2, h)
321+
with self.assertRaises(KeyError) as ex:
322+
h.delete(Z)
323+
self.assertIs(ex.exception.args[0], Z)
322324

323325
h = h.delete(A)
324326
self.assertEqual(len(h), orig_len - 3)
@@ -358,7 +360,9 @@ def test_map_delete_2(self):
358360
with self.assertRaisesRegex(ValueError, 'cannot compare'):
359361
h.delete(Er)
360362

361-
h = h.delete(Z)
363+
with self.assertRaises(KeyError) as ex:
364+
h.delete(Z)
365+
self.assertIs(ex.exception.args[0], Z)
362366
self.assertEqual(len(h), orig_len)
363367

364368
h = h.delete(C)
@@ -373,8 +377,10 @@ def test_map_delete_2(self):
373377
self.assertEqual(h.get(D), 'd')
374378
self.assertEqual(h.get(E), 'e')
375379

376-
h = h.delete(A)
377-
h = h.delete(B)
380+
with self.assertRaises(KeyError):
381+
h = h.delete(A)
382+
with self.assertRaises(KeyError):
383+
h = h.delete(B)
378384
h = h.delete(D)
379385
h = h.delete(E)
380386
self.assertEqual(len(h), 0)
@@ -499,11 +505,14 @@ def test_map_delete_5(self):
499505

500506
h = h.delete(keys[1])
501507
self.assertEqual(len(h), 14)
502-
h = h.delete(keys[1])
508+
with self.assertRaises(KeyError) as ex:
509+
h.delete(keys[1])
510+
self.assertIs(ex.exception.args[0], keys[1])
503511
self.assertEqual(len(h), 14)
504512

505513
for key in keys:
506-
h = h.delete(key)
514+
if key in h:
515+
h = h.delete(key)
507516
self.assertEqual(len(h), 0)
508517

509518
def test_map_items_1(self):

0 commit comments

Comments
 (0)