失敗してもretryするデコレータを書いてたら、頭の体操みたいなコードができました。
機能要件は、試行の最大回数と試行の時間間隔をデコレートするときに指定できるように…
それから、下記のコードはf文字列を使っているので python3.6+です。
from functools import wraps
from time import sleep, time
def retry(count=0, delay=0):
def _retry(func):
@wraps(func)
def wrapper(*args, **kwargs):
_delay = delay
_time = time()
for c in range(count):
print(f'time: {time()-_time:.1f}')
success = func(*args, **kwargs)
if success or c == count-1:
break
sleep(_delay)
_delay *= delay
return success
return wrapper
return _retry
try_count = 0
@retry(count=3, delay=1.5)
def unstable_func(threshold):
global try_count
try_count += 1
print(f'try count: {try_count}')
return True if try_count > threshold else False
if __name__ == '__main__':
print(f'unstable_func is {"succeeded" if unstable_func(3) else "failed"}')
print()
print(f'unstable_func is {"succeeded" if unstable_func(3) else "failed"}')
実行結果は
time: 0.0
try count: 1
time: 1.5
try count: 2
time: 3.8
try count: 3
unstable_func is failed
time: 0.0
try count: 4
unstable_func is succeeded
実際に使うときは、ちゃんとしたライブラリを使いましょう!
- pypi/retry → ドキュメントが簡潔。
- pypi/retrying → 機能豊富な感じ。