Skip to content

Commit a3734b4

Browse files
committed
Refactor.
1 parent 1046b78 commit a3734b4

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

src/cachetools/__init__.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,18 @@ def __getitem__(self, key, cache_getitem=Cache.__getitem__):
201201

202202
def __setitem__(self, key, value, cache_setitem=Cache.__setitem__):
203203
cache_setitem(self, key, value)
204-
self.__touch(key)
204+
if key in self.__nodes:
205+
self.__touch(key)
206+
else:
207+
head = self.__head
208+
node = head.next
209+
if not node:
210+
node = head.next = LFUCache._Node(freq=1, next=None, prev=head)
211+
node.items.add(key)
212+
self.__nodes[key] = node
205213

206214
def __delitem__(self, key, cache_delitem=Cache.__delitem__):
215+
# FIXME: delete empty nodes?
207216
cache_delitem(self, key)
208217
node = self.__nodes.pop(key)
209218
node.items.remove(key)
@@ -213,33 +222,24 @@ def popitem(self):
213222
curr = self.__head.next
214223
while curr:
215224
if curr.items:
216-
key = curr.items.pop() # we remove an arbitrary element
217-
del self.__nodes[key]
225+
key = next(iter(curr.items)) # remove an arbitrary element
218226
return (key, self.pop(key))
219227
curr = curr.next
220228
raise KeyError("%s is empty" % type(self).__name__) from None
221229

222230
def __touch(self, key):
223231
"""Increase use count"""
224232
node = self.__nodes.get(key, None)
225-
if node is None:
226-
head = self.__head
227-
node = head.next
228-
if not node:
229-
node = head.next = LFUCache._Node(freq=1, next=None, prev=head)
230-
node.items.add(key)
231-
self.__nodes[key] = node
232-
else:
233-
# FIXME: remove empty nodes, otherwise this may grow without bounds?
234-
# FIXME: LFUDecoratorTest::test_decorator_needs_rlock fails here?
235-
assert key in node.items
236-
node.items.remove(key)
237-
nf = node.freq + 1
238-
nn = node.next
239-
if not nn or nn.freq != nf:
240-
nn = node.next = LFUCache._Node(freq=nf, next=node.next, prev=node)
241-
nn.items.add(key)
242-
self.__nodes[key] = nn
233+
# FIXME: remove empty nodes, otherwise this may grow without bounds?
234+
# FIXME: LFUDecoratorTest::test_decorator_needs_rlock fails here
235+
assert key in node.items
236+
node.items.remove(key)
237+
nf = node.freq + 1
238+
nn = node.next
239+
if not nn or nn.freq != nf:
240+
nn = node.next = LFUCache._Node(freq=nf, next=node.next, prev=node)
241+
nn.items.add(key)
242+
self.__nodes[key] = nn
243243

244244

245245
class LRUCache(Cache):

0 commit comments

Comments
 (0)