如何建立一个有限制的撤消存储?

2024-09-30 01:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想建立一个数据结构来存储有限的undo buffer,以存储6 dict数据为例,使用以下伪代码:

rawdict1 = {1}
buffer = [{1}]

rawdict1 = {2}
buffer = [{2}{1}]      # {1} stored on the postion

rawdict1 = {3}
buffer = [{3}{2}{1}]      
...
rawdict1 = {5}
buffer = [{5}{4}{3}{2}{1}]      # max length limited to 5

rawdict1 = {6}
buffer = [{6}{5}{4}{3}{2}]      # {1} has been deleted because exceed the limit

when I want to restore the rawdict1 later, I can use something looks like:

rawdict1 = buffer[5]                 # restore the 5th dict.

我的问题是,现有的内置数据类型或标准库类型是否可以用于此目的?在

如果我想一次性存储dict和自定义类,这样的结构是否可以在一个结构实例中存储多个类型?在

谢谢!在

Rgs公司

KC公司


Tags: theto数据代码数据结构类型onbuffer
3条回答

或许可以用这样的方法:

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对象

^{pr2}$

设置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.\u缓冲区恢复值:

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)

您可以快速将列表子类化,使其只允许有限的存储。在

class LimitedStack(list):
 def __init__(self,limit=6):
    list.__init__(self)
    self.limit = limit

 def append(self,obj):
    if len(self) == self.limit:
        list.pop(self,0)
    list.append(self,obj)

Python列表不必是C中的泛型列表那样的特定类型。它们将存储您附加到它们的任何对象。在

您不能在裸名(例如rawdict1)上执行此操作,因为您无法截获对裸名的赋值,并使它们在某个时候“附加”执行,例如保存先前的值。对装饰过的名字很容易做到,例如:

undoable.rawdict1 = {1}

诸如此类,通过使undoable成为一个具有适当的__setitem__的类的实例,该实例将前一个值(如果有)附加到列表中,并在列表太长时弹出第0项。但这还不足以满足除赋值之外的其他“不可撤销”操作,比如undoable.rawdict1.update(whatever)——你确定不需要它吗?在

相关问题 更多 >

    热门问题