Возможно использовать что-то вроде этого:
import collections
class UndoBuffer(object):
def __init__(self,value,max_length=5):
self.max_length=max_length
self._buffer=collections.deque([value],max_length)
@property
def data(self):
return self._buffer[-1]
@data.setter
def data(self,value):
self._buffer.append(value)
def restore(self,index):
self.data=self._buffer[index]
Создать объект UndoBuffer
rawdict=UndoBuffer('{1}')
Установка атрибута data
автоматически сохраняет значение в _buffer
:
print(rawdict._buffer)
# deque(['{1}'], maxlen=5)
print(rawdict.data)
# {1}
При изменении значения rawdict.data
добавляется значение к rawdict._buffer
:
rawdict.data = '{2}'
print(rawdict._buffer)
# deque(['{1}', '{2}'], maxlen=5)
Buf, если вы открываете rawdict.data
, вы просто получаете самое последнее значение:
print(rawdict.data)
# {2}
Измените значение еще несколько раз.«{1}» удаляется, когда буфер заполнен до максимальной длины:
rawdict.data = '{3}'
rawdict.data = '{4}'
rawdict.data = '{5}'
print(rawdict._buffer)
# deque(['{1}', '{2}', '{3}', '{4}', '{5}'], maxlen=5)
rawdict.data = '{6}'
print(rawdict._buffer)
# deque(['{2}', '{3}', '{4}', '{5}', '{6}'], maxlen=5)
Восстановление значения из rawdict._buffer:
rawdict.restore(0) # set rawdict.data to rawdict._buffer[0]
print(rawdict.data)
# {2}
print(rawdict._buffer)
# deque(['{3}', '{4}', '{5}', '{6}', '{2}'], maxlen=5)