This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author zach.ware
Recipients eric.snow, zach.ware
Date 2016-09-08.03:28:02
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1473305282.86.0.291402257469.issue28014@psf.upfronthosting.co.za>
In-reply-to
Content
I'm not certain that the implementation of this subclass of OrderedDict is actually sane, but it works in 3.4 and fails in 3.5+.

The buggy implementation:

class SimpleLRUCache(OrderedDict):

    def __init__(self, size):
        super().__init__()
        self.size = size

    def __getitem__(self, item):
        value = super().__getitem__(item)
        self.move_to_end(item)
        return value

    def __setitem__(self, key, value):
        while key not in self and len(self) >= self.size:
            self.popitem(last=False)
        super().__setitem__(key, value)
        self.move_to_end(key)


When trying to add a new item after `size` items are already in the cache, it will throw a KeyError with the key of the item in the oldest position.  Something like:

>>> s = SimpleLRUCache(2)
>>> s['t1'] = 1
>>> s['t2'] = 2
>>> s['t2'] # gives 2, properly moves 2 to the end
>>> s['t3'] = 3

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "simple_lru.py", line 14, in __setitem__
    self.popitem(last=False)
  File "simple_lru.py", line 9, in __getitem__
    self.move_to_end(item)
KeyError: 't3'


I can work around the failure by implementing __getitem__ as follows:

    def __getitem__(self, item):
        value = super().__getitem__(item)
        del self[item]
        self[item] = value
        return value

Attached is a script with a couple of tests that pass with 3.4 and fail with 3.5+.
History
Date User Action Args
2016-09-08 03:28:02zach.waresetrecipients: + zach.ware, eric.snow
2016-09-08 03:28:02zach.waresetmessageid: <1473305282.86.0.291402257469.issue28014@psf.upfronthosting.co.za>
2016-09-08 03:28:02zach.warelinkissue28014 messages
2016-09-08 03:28:02zach.warecreate