[New-bugs-announce] [issue28014] Strange interaction between methods in subclass of C OrderedDict
Zachary Ware
report at bugs.python.org
Wed Sep 7 23:28:02 EDT 2016
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 <report at bugs.python.org>
<http://bugs.python.org/issue28014>
_______________________________________
More information about the New-bugs-announce
mailing list