diff options
author | Kali Kaneko <kali@leap.se> | 2013-12-18 22:31:23 -0400 |
---|---|---|
committer | Kali Kaneko <kali@leap.se> | 2013-12-18 22:31:23 -0400 |
commit | 4879753edfc7380e1e96d882716b60e981a4de53 (patch) | |
tree | ab32ecf8aa3726de1fda01773d1ce51a448b4160 /src/leap | |
parent | f498b0eca553176f69f7be4eb42206f579b9be8b (diff) |
Fix memoize decorator: raise instead of storing None
With this fix, we will re-raise an exception that happens
while evaluating the callable, instead of storing None as value.
Diffstat (limited to 'src/leap')
-rw-r--r-- | src/leap/common/decorators.py | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/leap/common/decorators.py b/src/leap/common/decorators.py index ec6171a..e708fc4 100644 --- a/src/leap/common/decorators.py +++ b/src/leap/common/decorators.py @@ -56,6 +56,15 @@ class _memoized(object): :tyoe args: tuple :type kwargs: dict """ + def ret_or_raise(value): + """ + Returns the value except if it is an exception, + in which case it's raised. + """ + if isinstance(value, Exception): + raise value + return value + if self.is_method: # forget about `self` as key key_args = args[1:] @@ -74,15 +83,16 @@ class _memoized(object): if key in self.cache: logger.debug("Got value from cache...") - return self.cache[key] + value = self.cache[key] + return ret_or_raise(value) else: try: value = self.func(*args, **kwargs) except Exception as exc: logger.error("Exception while calling function: %r" % (exc,)) - value = None + value = exc self.cache[key] = value - return value + return ret_or_raise(value) def __repr__(self): """ |