Is there a way to log number of retries made

You can use the wait_func parameter for retry with a function that takes the number of attempts and the number of milliseconds of delay as parameters, and prints a message as desired:

from retrying import retry
import time

def wait(attempts, delay):
    print('Attempt #%d, retrying in %d seconds' % (attempts, delay // 1000))
    return delay

@retry(wait_func=wait)
def f():
    time.sleep(1)
    raise RuntimeError

f()

This outputs:

Attempt #1, retrying in 1 seconds
Attempt #2, retrying in 3 seconds
Attempt #3, retrying in 7 seconds
Attempt #4, retrying in 15 seconds
...

If you would like to use the exponential sleep option, however, you would have to instantiate your own Retrying instance and use a custom decorator to make use of it, so that your custom wait function can call the exponential_sleep method with your Retrying instance:

from retrying import Retrying

def wait(attempts, delay):
    print('Attempt #%d, retrying in %d seconds' % (attempts, delay // 1000))
    return retrying.exponential_sleep(attempts, delay)

retrying = Retrying(wait_func=wait, stop_max_attempt_number=10, wait_exponential_multiplier=1000, wait_exponential_max=10000)
custom_retry = lambda f: lambda *args, **kwargs: retrying.call(f, *args, **kwargs)

@custom_retry
def f():
    raise RuntimeError

f()

This outputs:

Attempt #1, retrying in 0 seconds
Attempt #2, retrying in 2 seconds
Attempt #3, retrying in 6 seconds
Attempt #4, retrying in 14 seconds
Attempt #5, retrying in 24 seconds
Attempt #6, retrying in 34 seconds
...

Here is another approach to resolve it

after_attempts as another flag which could be used

def _after(attempt_number):
    print(attempt_number)


@retry(wait_fixed=100, stop_max_attempt_number=3, after_attempts=_after)
def _test_after():
    raise Exception("testing after_attempts handler")

But this is still under development and could be fetched using retrying master code not part of latest release : 1.3.3

Tags:

Python

Module