Le décorateur doit réessayer

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

Le décorateur doit réessayer
Décorateur 1
Décorateur 2
Comment utiliser le décorateur
Décorateur
Décorateur
Décorateur pour désactiver la sortie standard
[Présentation de l'application Udemy Python3 +] 57. Décorateur
Décorateur MyHDL
Decorator pour éviter UnicodeEncodeError dans Python 3 print ()
Utilisez le mode de traitement des nouvelles tentatives ajouté à Boto3