1

成功するか、あきらめる前に最大試行回数に達するまで、例外を発生させる関数が再度実行されるように、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 回実行されます (このバグが発生するには、呼び出しでキーワード引数を明示的に使用する必要があることに注意してください!)。

4

2 に答える 2