Tôi đang cố gắng tạo một đối tượng hoạt động như được xây dựng trong list
, ngoại trừ giá trị của nó được lưu khi đã sửa đổi.Làm thế nào để triển khai một danh sách `Python` liên tục?
Triển khai tôi đưa ra là gói list
trong lớp PersistentList
. Đối với mọi truy cập vào phương thức có thể thay đổi danh sách, trình bao bọc ủy quyền cho gói list
và lưu nó vào cơ sở dữ liệu khóa-giá trị sau khi nó được gọi.
Code:
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)
Có một số vấn đề với việc thực hiện này:
Tôi có để trang trí các phương pháp như
append
mỗi khi họ truy cập, là có một cách tốt hơn để trang trí nhiều phương pháp của một số đối tượng ?Thao tác như
l += [1,2,3]
không hoạt động vì tôi chưa triển khai phương thức iadd.
Tôi có thể làm gì để đơn giản hóa điều này?
gì nếu một trong các phương pháp danh sách bạn gọi đặt ra một ngoại lệ? Bạn vẫn muốn làm việc lưu? Giải pháp hiện tại của bạn vẫn làm được ... –