Quand j'ai écrit un décorateur qui réessayerait même si j'échouais, j'ai reçu un code comme un exercice cérébral. Les exigences fonctionnelles peuvent être spécifiées lors de la décoration du nombre maximum d'essais et de l'intervalle de temps entre les essais ...
Ensuite, le code ci-dessous est python3.6 + car il utilise la chaîne f.
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"}')
Le résultat de l'exécution est
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
Lorsque vous l'utilisez réellement, utilisez une bibliothèque appropriée!
Recommended Posts