Próbuję sprawić, aby obiekt działał jak wbudowany list
, z tą różnicą, że jego wartość zostanie zapisana po modyfikacji.Jak zaimplementować trwałą listę `Pythona '?
Implementacja, którą wymyślam, jest opakowaniem klasy list
w klasie PersistentList
. W przypadku każdego dostępu do metody, która może zmienić listę, opakowanie jest przekazywane do zapakowanego pliku list
i zapisywane w bazie danych klucz-wartość po jej wywołaniu.
Kod:
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)
Istnieje kilka problemów z tym realizacji:
mam do dekorowania metod jak
append
każdym razem są one obejrzano, czy istnieje lepszy sposób, aby ozdobić wielokrotność metody jakiegoś obiektu?operacje jak
l += [1,2,3]
nie działa, ponieważ nie mam wdrożył metodę iadd.
Co mogę zrobić, aby to uprościć?
Co jeśli jedna z metod lista nawiązywać połączenia podnosi wyjątek? Nadal chcesz zrobić save? Obecne rozwiązanie nadal to robi ... –