class LOLERROR(Exception):
pass
def retry(tries, delay=3, backoff=2):
def _retry(f):
def f_retry(*args, **kwargs):
last_exception = None
for attempt in range(1, tries + 1):
try:
ret = f(*args, **kwargs)
except Exception as e:
last_exception = e
if attempt < tries:
print "sleep:", delay * (backoff ** (attempt - 1))
continue
# success
return ret
# ran through our tries, bail out
raise last_exception
return f_retry
return _retry
#@retry(5)
def foo(a):
print a
raise LOLERROR
retry(5)(foo)("test")
Y2xhc3MgTE9MRVJST1IoRXhjZXB0aW9uKToKCXBhc3MKCmRlZiByZXRyeSh0cmllcywgZGVsYXk9MywgYmFja29mZj0yKToKCWRlZiBfcmV0cnkoZik6CgkJZGVmIGZfcmV0cnkoKmFyZ3MsICoqa3dhcmdzKToKCQkJbGFzdF9leGNlcHRpb24gPSBOb25lCgkJCWZvciBhdHRlbXB0IGluIHJhbmdlKDEsIHRyaWVzICsgMSk6CgkJCQl0cnk6CgkJCQkJcmV0ID0gZigqYXJncywgKiprd2FyZ3MpCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJbGFzdF9leGNlcHRpb24gPSBlCgkJCQkJaWYgYXR0ZW1wdCA8IHRyaWVzOgoKCQkJCQkJcHJpbnQgInNsZWVwOiIsIGRlbGF5ICogKGJhY2tvZmYgKiogKGF0dGVtcHQgLSAxKSkKCgkJCQkJY29udGludWUKCQkJCSMgc3VjY2VzcwoJCQkJcmV0dXJuIHJldAoJCQkjIHJhbiB0aHJvdWdoIG91ciB0cmllcywgYmFpbCBvdXQKCQkJcmFpc2UgbGFzdF9leGNlcHRpb24gCgkJcmV0dXJuIGZfcmV0cnkKCXJldHVybiBfcmV0cnkKCQkJCgojQHJldHJ5KDUpCQpkZWYgZm9vKGEpOgoJcHJpbnQgYQoJcmFpc2UgTE9MRVJST1IKCnJldHJ5KDUpKGZvbykoInRlc3QiKQ==