summaryrefslogtreecommitdiff
path: root/retrying.py
diff options
context:
space:
mode:
Diffstat (limited to 'retrying.py')
-rw-r--r--retrying.py25
1 files changed, 23 insertions, 2 deletions
diff --git a/retrying.py b/retrying.py
index 547509f..bcb7a9d 100644
--- a/retrying.py
+++ b/retrying.py
@@ -23,6 +23,12 @@ import traceback
MAX_WAIT = 1073741823
+def _retry_if_exception_of_type(retryable_types):
+ def _retry_if_exception_these_types(exception):
+ return isinstance(exception, retryable_types)
+ return _retry_if_exception_these_types
+
+
def retry(*dargs, **dkw):
"""
Decorator function that instantiates the Retrying object
@@ -69,7 +75,9 @@ class Retrying(object):
wrap_exception=False,
stop_func=None,
wait_func=None,
- wait_jitter_max=None):
+ wait_jitter_max=None,
+ before_attempts=None,
+ after_attempts=None):
self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number
self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay
@@ -82,6 +90,8 @@ class Retrying(object):
self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max
self._wait_incrementing_max = MAX_WAIT if wait_incrementing_max is None else wait_incrementing_max
self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max
+ self._before_attempts = before_attempts
+ self._after_attempts = after_attempts
# TODO add chaining of stop behaviors
# stop behavior
@@ -129,9 +139,14 @@ class Retrying(object):
if retry_on_exception is None:
self._retry_on_exception = self.always_reject
else:
+ # this allows for providing a tuple of exception types that
+ # should be allowed to retry on, and avoids having to create
+ # a callback that does the same thing
+ if isinstance(retry_on_exception, (tuple)):
+ retry_on_exception = _retry_if_exception_of_type(
+ retry_on_exception)
self._retry_on_exception = retry_on_exception
- # TODO simplify retrying by Exception types
# retry on result filter
if retry_on_result is None:
self._retry_on_result = self.never_reject
@@ -203,6 +218,9 @@ class Retrying(object):
start_time = int(round(time.time() * 1000))
attempt_number = 1
while True:
+ if self._before_attempts:
+ self._before_attempts(attempt_number)
+
try:
attempt = Attempt(fn(*args, **kwargs), attempt_number, False)
except:
@@ -212,6 +230,9 @@ class Retrying(object):
if not self.should_reject(attempt):
return attempt.get(self._wrap_exception)
+ if self._after_attempts:
+ self._after_attempts(attempt_number)
+
delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time
if self.stop(attempt_number, delay_since_first_attempt_ms):
if not self._wrap_exception and attempt.has_exception: