Skip to content

Instantly share code, notes, and snippets.

@vimfu
Last active February 28, 2019 09:47
Show Gist options
  • Save vimfu/9f7b07f868de716b0b2a16f137f70748 to your computer and use it in GitHub Desktop.
Save vimfu/9f7b07f868de716b0b2a16f137f70748 to your computer and use it in GitHub Desktop.
Python `retry` function (recursion version)
# Version 1.0.1
def retry(times=5, interval=15, max_interval=600):
def _iter(n, fn, *args, **kwargs):
try:
res = fn(*args, **kwargs)
return res
except Exception as e:
if n <= 0:
raise e
else:
print(e)
import time
time.sleep(min(max_interval, 2 ** (times - n) * interval))
return _iter(n - 1, fn, *args, **kwargs)
def wraped(fn):
@wraps(fn)
def _(*args, **kwargs):
return _iter(times, fn, *args, **kwargs)
return _
import types
if types.FunctionType == type(times):
fn = times
times = 5
return wraped(fn)
return wraped
# Version 1.0
def retry(times=5, interval=15, max_interval=600):
def _iter(n, fn, *args, **kwargs):
try:
res = fn(*args, **kwargs)
return res
except Exception as e:
if n <= 0:
raise e
else:
print(e)
import time
time.sleep(min(max_interval, 2 ** (times - n) * interval))
return _iter(n - 1, fn, *args, **kwargs)
def wraped(fn):
@wraps(fn)
def _(*args, **kwargs):
return _iter(times, fn, *args, **kwargs)
return _
return wraped
# Version 0.0.1
def retry(fn):
N = 6
def _iter(n, fn, *args, **kwargs):
try:
res = fn(*args, **kwargs)
return res
except Exception as e:
if n <= 0:
raise e
else:
print(e)
import time
time.sleep(2 ** (N - n) * 1)
return _iter(n - 1, fn, *args, **kwargs)
@wraps(fn)
def _(*args, **kwargs):
return _iter(N, fn, *args, **kwargs)
return _
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment