reretry
An easy to use retry decorator.
This package is a fork from the retry package, but with some of added community-sourced features.
Features
New features in reretry:
- Log traceback of an error that lead to a failed attempt.
- Call a custom callback after each failed attempt.
- Can be used with async functions.
From original retry:
- Retry on specific exceptions.
- Set a maximum number of retries.
- Set a delay between retries.
- Set a maximum delay between retries.
- Set backoff and jitter parameters.
- Use a custom logger.
- No external dependencies (stdlib only).
- (Optionally) Preserve function signatures (
pip install decorator).
Installation
$ pip install reretry
API
The @retry decorator
Usage
@retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, show_traceback=False, logger=logging_logger, fail_callback=None)
Arguments
-
exceptions: An exception or a tuple of exceptions to catch. Default: Exception. -
tries: The maximum number of attempts. default: -1 (infinite). -
delay: Initial delay between attempts (in seconds). default: 0. -
max_delay: The maximum value of delay (in seconds). default: None (no limit). -
backoff: Multiplier applied to delay between attempts. default: 1 (no backoff). -
jitter: Extra seconds added to delay between attempts. default: 0. Fixed if a number, random if a range tuple (min, max). -
show_traceback: Print traceback before retrying (Python3 only). default: False. -
logger:logger.warning(fmt, error, delay)will be called on failed attempts. default: retry.logging_logger. if None, logging is disabled. -
fail_callback:fail_callback(e)will be called after failed attempts.
Examples
from reretry import retry
@retry()
def make_trouble():
'''Retry until succeeds'''
@retry()
async def async_make_trouble():
'''Retry an async function until it succeeds'''
@retry(ZeroDivisionError, tries=3, delay=2)
def make_trouble():
'''Retry on ZeroDivisionError, raise error after 3 attempts,
sleep 2 seconds between attempts.'''
@retry((ValueError, TypeError), delay=1, backoff=2)
def make_trouble():
'''Retry on ValueError or TypeError, sleep 1, 2, 4, 8, ... seconds between attempts.'''
@retry((ValueError, TypeError), delay=1, backoff=2, max_delay=4)
def make_trouble():
'''Retry on ValueError or TypeError, sleep 1, 2, 4, 4, ... seconds between attempts.'''
@retry(ValueError, delay=1, jitter=1)
def make_trouble():
'''Retry on ValueError, sleep 1, 2, 3, 4, ... seconds between attempts.'''
def callback(e: Exception):
'''Print error message'''
print(e)
@retry(ValueError, fail_callback=callback):
def make_trouble():
'''Retry on ValueError, between attempts call callback(e)
(where e is the Exception raised).'''
# If you enable logging, you can get warnings like 'ValueError, retrying in
# 1 seconds'
if __name__ == '__main__':
import logging
logging.basicConfig()
make_trouble()
The retry_call function
Calls a function and re-executes it if it failed.
This is very similar to the decorator, except that it takes a function and its arguments as parameters. The use case behind it is to be able to dynamically adjust the retry arguments.
Usage
retry_call(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, show_traceback=False, logger=logging_logger, fail_callback=None)
Example
import requests
from reretry.api import retry_call
def make_trouble(service, info=None):
if not info:
info = ''
r = requests.get(service + info)
return r.text
def what_is_my_ip(approach=None):
if approach == "optimistic":
tries = 1
elif approach == "conservative":
tries = 3
else:
# skeptical
tries = -1
result = retry_call(
make_trouble,
fargs=["http://ipinfo.io/"],
fkwargs={"info": "ip"},
tries=tries
)
print(result)
what_is_my_ip("conservative")
Metadata
Release files for reretry 0.11.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| reretry-0.11.8.tar.gz | 4.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| reretry-0.11.8-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 10.4 kB
Release files / reretry-0.11.8.tar.gz
| Download URL | reretry-0.11.8.tar.gz |
|---|---|
| Size | 4.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f2791fcebe512ea2f1d153a2874778523a8064860b591cd90afc21a8bed432e3
|
|
BLAKE2b-256 checksum How to use checksums |
401d25d562a62b7471616bccd7c15a7533062eb383927e68667bf331db990415
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.16
|
Release files / reretry-0.11.8-py2.py3-none-any.whl
| Download URL | reretry-0.11.8-py2.py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
5ec1084cd9644271ee386d34cd5dd24bdb3e91d55961b076d1a31d585ad68a79
|
|
BLAKE2b-256 checksum How to use checksums |
6611e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.16
|
Security for reretry 0.11.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.