From 34a6d18475b3b54b80b78342b51a61b35b8b0000 Mon Sep 17 00:00:00 2001 From: Goffi Date: Sun, 29 Jul 2018 18:44:49 +0200 Subject: [PATCH] core (memory/persistent): better default value handling in LazyPersistentBinaryDict (don't jump to debugger in debug mode if value is not found) --- sat/memory/persistent.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/sat/memory/persistent.py b/sat/memory/persistent.py index 2a406543..626a413f 100644 --- a/sat/memory/persistent.py +++ b/sat/memory/persistent.py @@ -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):