Как реализовать постоянный `список` Python?

Я пытаюсь заставить объект действовать как встроенный список , за исключением того, что его значение сохраняется после изменения.

Реализация, которую я придумал, представляет собой оболочку списка в классе PersistentList . Для каждого доступа к методу, который может изменить список, оболочка делегирует обернутый список и сохраняет его в базе данных «ключ-значение» после его вызова.

Код:

class PersistentList(object):
    def __init__(self, key):
        self.key = key 
        self._list = db.get(key, []) 

    def __getattr__(self, name):
        attr = getattr(self._list, name)
        if attr:
            if attr in ('append', 'extend', 'insert', 'pop',
                'remove', 'reverse', 'sort'):
                attr = self._autosave(attr)
            return attr
        raise AttributeError

    def _autosave(self, func):
        @wraps(func)
        def _(*args, **kwargs):
            ret = func(*args, **kwargs)
            self._save()
            return ret 
        return _

    def _save(self):
        db.set(self.key, self._list)

У этой реализации есть несколько проблем:

  1. Мне нужно украшать такие методы, как append , каждый раз, когда они доступ, есть ли лучший способ украсить несколько методов некоторых объект?

  2. Операции типа l + = [1,2,3] не работают, потому что я не реализован метод iadd .

Что я могу сделать, чтобы упростить это?

8
задан satoru 26 February 2012 в 01:28
поделиться