Retry decorator with a bunch of configuration parameters.


Keywords
retry, decorator
License
Apache-2.0
Install
pip install retryz==0.1.9

Documentation

Retry Decorator

VERSION: 0.1.9

Introduction

Function decorator that helps to retry the function under certain criteria.

This package contains the retry decorator and a bunch of configuration parameters for this decorator.

Tested on python 2.7 and python 3.4.

For quick start, check the tutorial section of this page. Check [test_retryz.py](test/test_retryz.py) for detail examples.

Installation

pip install retryz

License

Apache License version 2

Tutorial

  • Retry if ValueError is caught.
@retry(on_error=ValueError)
def my_func():
    ...
  • Retry if ValueError or TypeError is caught.
@retry(on_error=lambda e: isinstance(e, (ValueError, TypeError)))
def my_func():
    ...
  • Retry until TypeError is caught.
@retry(on_error=lambda e: not isinstance(e, TypeError))
def my_func():
    ...
  • Retry until TypeError or AttributeError is caught.
@retry(on_error=lambda e: not isinstance(e, (TypeError, AttributeError)))
def my_func():
    ...
  • When on_error is a callback, it will retry until on_error returns False. Note that callback takes one parameter which is the error instance raised by the decorated function.
def _error_callback(self, ex):
    assert_that(ex, instance_of(TypeError))
    return self.call_count != 4

@retry(on_error=_error_callback)
def error_call_back(self):
    ...
  • Retry if returns certain value.
@retry(on_return=True)
def my_func(self):
    ...
  • Retry if return value in the list.
@retry(on_return=lambda x: x in (1, 2, 3, 4, 5))
def my_func(self):
    ...
  • Retry until certain value is returned.
@retry(on_return=lambda x: x != 4)
def my_func(self):
    ...
  • Retry until any of the value is returned.
@retry(on_return=lambda x: x not in [3, 4])
def my_func(self):
    ...
  • When on_return is a callback, it will retry until on_return returns False. Note that callback takes one parameter which is the return value of the decorated function.
def _return_callback(ret):
    return 4 + ret < 7

@retry(on_return=_return_callback)
def my_func(self):
    ...
  • Retry until timeout (in seconds)
@retry(timeout=0.1)
def my_func():
    ...
  • Retry maximum X times.
@retry(limit=3)
def my_func():
    ...

# or you could specify a callback
@retry(limit=lambda: 4)
def my_func_x():
    ...
  • Wait X seconds between each retry.
@retry(wait=0.1, timeout=0.3)
def my_func():
    ...
  • When wait is a callback, it will wait for the amount of seconds returned by the callback. The callback takes one parameter which is the current count of retry.
def _wait_callback(self, tried):
    return 2 ** tried

@retry(wait=_wait_callback, timeout=0.1)
def my_func():
    ...
  • on_retry could be used to specify a callback. This callback is a function with no parameter. It will be invoked before each retry. Here is a typical usage.
def do_login():
    # login if not
    ...

@retry(on_retry=do_login, limit=2)
def requests(resource_id):
    ...
  • retry could also be called in a functional style. Note that the return value is a function. If you want to call it, you need to add an extra ().
def foo():
    ...

retry(foo, limit=3, timeout=5)()

To file issue, please visit:

https://github.com/jealous/retryz

Contact author: