New submission from Zachary Ware: 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+. ---------- files: simple_lru.py messages: 274959 nosy: eric.snow, zach.ware priority: normal severity: normal status: open title: Strange interaction between methods in subclass of C OrderedDict type: behavior versions: Python 3.5, Python 3.6 Added file: http://bugs.python.org/file44458/simple_lru.py _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue28014> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com