Sto provando a fare in modo che un oggetto si comporti come un list
integrato, tranne per il fatto che il suo valore viene salvato una volta modificato.Come implementare un `elenco` Python persistente?
L'implementazione che arrivo è il wrapping di list
in una classe PersistentList
. Per ogni accesso al metodo che può modificare l'elenco, il wrapper delega al pacchetto list
e lo salva in un database valore-chiave dopo che è stato richiamato.
Codice:
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)
Ci sono diversi problemi con questa implementazione:
devo decorare metodi come
append
ogni volta che sono accesso, c'è un modo migliore per decorare multipla metodi di alcuni oggetti ?Operazioni come
l += [1,2,3]
non funzionano perché non ho implementato il metodo IADD.
Cosa posso fare per semplificare questo?
Che cosa succede se uno dei metodi delle liste si chiama solleva un'eccezione? Vuoi ancora salvare? La tua attuale soluzione lo fa ancora ... –