成功するか、あきらめる前に最大試行回数に達するまで、例外を発生させる関数が再度実行されるように、Python デコレータを作成したいと思います。
そのようです :
def tryagain(func):
def retrier(*args,**kwargs,attempts=MAXIMUM):
try:
return func(*args,**kwargs)
except Exception as e:
if numberofattempts > 0:
logging.error("Failed. Trying again")
return retrier(*args,**kwargs,attempts=attempts-1)
else:
logging.error("Tried %d times and failed, giving up" % MAXIMUM)
raise e
return retrier
私の問題は、kwargs に含まれる名前に関係なく、試行回数を示すために使用される名前と衝突しないという保証が必要なことです。
attempts
ただし、関数自体がキーワード引数として使用される場合、これは機能しません
@tryagain
def other(a,b,attempts=c):
...
raise Exception
other(x,y,attempts=z)
この例では、other が実行されると、MAXIMUM 回ではなく z 回実行されます (このバグが発生するには、呼び出しでキーワード引数を明示的に使用する必要があることに注意してください!)。