Skip to content

Commit cea1c3a

Browse files
author
chanchiem
committed
Delete keys after iterating to prevent mutation during iter
1 parent 4f4b2df commit cea1c3a

2 files changed

Lines changed: 5 additions & 2 deletions

File tree

expiringdict/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,17 @@ def __init__(self, max_len, max_age_seconds, items=None):
5858
def __len__(self):
5959
with self.lock:
6060
current_key = iter(self)
61+
keys_to_del = []
6162
for k in current_key:
6263
item = OrderedDict.__getitem__(self, k)
6364
time_added = item[1]
6465
item_age = time.time() - time_added
6566
if item_age > self.max_age:
66-
del self[k]
67+
keys_to_del.append(k)
6768
else:
6869
break
70+
for k in keys_to_del:
71+
del self[k]
6972

7073
return super(ExpiringDict, self).__len__()
7174

tests/expiringdict_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def test_repr():
6565
d['a'] = 'x'
6666
eq_(str(d), "ExpiringDict([('a', 'x')])")
6767
sleep(0.01)
68-
eq_(str(d), "ExpiringDict()")
68+
eq_(str(d), "ExpiringDict([])")
6969

7070

7171
def test_iter():

0 commit comments

Comments
 (0)