[docs]class storage_property:
def __init__(self, name, default=None, storage='storage', serialize=None, deserialize=None):
self.name = name
self.default = default
self.storage_name = storage
self._setter = lambda self, val: serialize(val) if serialize else val
self._getter = lambda self, val: deserialize(val) if deserialize else val
[docs] def get_storage(self, obj):
if not hasattr(obj, self.storage_name):
msg = 'Object %s does not have attribute %r' % (obj, self.storage_name)
raise RuntimeError(msg)
return getattr(obj, self.storage_name)
def __get__(self, obj, objtype=None):
if obj is None:
return self
with self.get_storage(obj) as s:
value = s.get(self.name, self.default)
return self._getter(obj, value)
def __set__(self, obj, value):
with self.get_storage(obj) as s:
s[self.name] = self._setter(obj, value)
[docs] def setter(self, func):
self._setter = func
return func
[docs] def getter(self, func):
self._getter = func
return func