が、私はそのような再試行メカニズムを使用している関数内でデコレータを使う:(exceptブロック/常に挑戦中)関数の内部
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))
[.......]
私はの他の部分に数回、このメカニズムを使用しています同じ機能と他の機能で使用できます。コードのこの部分だけにデコレータを適用することは可能でしょうか?
def load(self):
[.......]
@retry(max=5,message='blablabla')
try:
cu.lock()
break
except LockError as l_error:
[.......]
@retry(max=5)
try:
cu.unlock()
break
except LockError as l_error:
もしそうなら、そのようなタスクを行うためのデコレータの例を私に教えてもらえますか?
デコレータは機能のみで動作します。また、ここでメソッドを使用して、リトライパラメータを引数として渡すのはなぜですか?毎回同じコードを実行しようとしているようです。 –
@KurtStutsman - 私はOPの特定のユースケースについてはわかりませんが、 'retry'部分がいくつかの関数で実行された古いコードを見てきました。再試行は基本的な機能( 'lock'、' unlock'、 'update'、' delete'など - データベースコマンドなど)。これは、 'maxRetries'で10個のメソッドを乱雑にするのではなく、' decorator'機能を使用するための完璧なユースケースのようです。それは、あなたの最初の文章にはスポットがあり、OPは何を進める必要があると言いました。 – dwanderson