[PYTHON] Dekorateur zu versuchen

Als ich einen Dekorateur schrieb, der es erneut versuchte, selbst wenn ich versagte, bekam ich einen Code wie eine Gehirnübung. Funktionale Anforderungen können angegeben werden, wenn die maximale Anzahl von Versuchen und das Zeitintervall zwischen Versuchen ...

Dann lautet der folgende Code python3.6 +, da er die Zeichenfolge f verwendet.

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"}')

Das Ausführungsergebnis ist

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

Wenn Sie es tatsächlich verwenden, verwenden Sie eine geeignete Bibliothek!

Recommended Posts

Dekorateur zu versuchen
Dekorateur 1
Dekorateur 2
Wie benutzt man den Dekorateur?
Dekorateur
Dekorateur
Dekorateur zum Stummschalten der Standardausgabe
[Einführung in die Udemy Python3 + -Anwendung] 57. Decorator
MyHDL Dekorateur
Dekorateur zur Vermeidung von UnicodeEncodeError in Python 3 print ()
Verwenden Sie den zu Boto3 hinzugefügten Wiederholungsverarbeitungsmodus