Innerhalb einer Funktion eines Wiederholungsmechanismus wie, dass ich mit (immer in einem Try/außer Block):Mit Dekorateur in einer Funktion
def load(self):
[........]
# Retry mechanism for locking database
for i in range(1, max_connection_retries+1):
try:
cu.lock()
break
except LockError as l_error:
if i < max_connection_retries:
sleep(20)
continue
else:
raise ContinuableError (logger.console(datetime.now().time().strftime ("%b %d %H:%M:%S") + ' ERROR:Impossible to lock the database after %i retries' % max_connection_retries))
[.......]
Ich verwende diesen Mechanismus mehrmals in anderem Teil der gleiche Funktion und in anderen Funktionen. Es wäre möglich, einen Dekorator nur auf diesen Teil des Codes anzuwenden? etwas wie das:
Wenn ja, könnten Sie mir helfen, mir ein Beispiel eines Dekorators für solch eine Aufgabe zu zeigen?
Dekoratoren funktionieren nur mit Funktionen. Warum würden Sie nicht einfach eine Methode hier verwenden und die Wiederholungsparameter als Argumente übergeben? Es sieht so aus, als würden Sie jedes Mal denselben Code ausführen. –
@KurtStutsman - Ich bin mir nicht sicher über den spezifischen Anwendungsfall des OP, aber ich weiß, dass ich alten Code gesehen habe, wo der 'retry'-Teil für eine Reihe von Funktionen gemacht wurde, und die Wiederholung war agnostisch bezüglich der zugrundeliegenden Funktionalität ('lock',' unlock', 'update',' delete', etc - Datenbankbefehle oder etwas). Dies scheint ein perfekter Anwendungsfall für die Verwendung der "Dekorator" -Funktionalität zu sein, anstatt 10 Methoden mit "maxRetries" zu überladen. Das heißt, Ihr erster Satz ist genau richtig und was das OP braucht, um voranzukommen. – dwanderson