Skip to main content

reretry

codecov CodeFactor

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)

Source distribution for reretry 0.11.8
File Size Uploaded Provenance
reretry-0.11.8.tar.gz 4.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for reretry 0.11.8
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

0.11.8 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page