core (memory/persistent): better default value handling in LazyPersistentBinaryDict (don't jump to debugger in debug mode if value is not found)

This commit is contained in:
Goffi 2018-07-29 18:44:49 +02:00
commit 34a6d18475

View file

@ -20,6 +20,7 @@
from sat.core.i18n import _
from sat.core.log import getLogger
log = getLogger(__name__)
from twisted.python import failure
class MemoryNotInitializedError(Exception):
@ -199,26 +200,35 @@ class LazyPersistentBinaryDict(PersistentBinaryDict):
def __iter__(self):
raise NotImplementedError
def _data2value(self, data, key):
try:
return data[key]
except KeyError as e:
# we return a Failure here to avoid the jump
# into debugger in debug mode.
raise failure.Failure(e)
def __getitem__(self, key):
"""get the value as a Deferred"""
d = self.storage.getPrivates(self.namespace, keys=[key], binary=self.binary, profile=self.profile)
d.addCallback(lambda data: data[key])
d = self.storage.getPrivates(self.namespace, keys=[key], binary=self.binary,
profile=self.profile)
d.addCallback(self._data2value, key)
return d
def __setitem__(self, key, value):
self.storage.setPrivateValue(self.namespace, key, value, self.binary, self.profile)
self.storage.setPrivateValue(self.namespace, key, value, self.binary,
self.profile)
def __delitem__(self, key):
self.storage.delPrivateValue(self.namespace, key, self.binary, self.profile)
def _valueOrDefault(self, value, default):
if value is None:
return default
return value
def _defaultOrException(self, failure_, default):
failure_.trap(KeyError)
return default
def get(self, key, default=None):
d = self.__getitem__(key)
d.addCallback(self._valueOrDefault)
d.addErrback(self._defaultOrException, default=default)
return d
def setdefault(self, key, default):