我正在开发一个装饰器,它将重试运行一个函数,最多N次,如下所示:
def retry(exceptions, truncate=5, delay=0.25):
"""Retry the decorated function using an exponential backoff strategy.
If the function does not complete successfully a TimeoutException is
raised."""
def wrapper(func):
@wraps(func)
def wrapped(*args, **kwargs):
tries = 0
while tries < truncate:
try:
return func(*args, **kwargs)
except exceptions, e:
print "%s, Retrying in %d seconds..." % (str(e), delay)
time.sleep(delay)
>> delay += delay
tries += 1
else:
raise TimeoutException()
return wrapped
return wrapper
对我而言,代码看起来很合理,但在突出显示pyflakes抱怨的行上,报告:
W804局部变量'延迟'(在x行的封闭范围中定义) 在分配前引用
这对我来说没有多大意义。 delay
已经分配了一个值,我可能应该能够将其作为我的参考。有人可以解释错误是什么,如果合理,我该如何修复它?
答案 0 :(得分:5)
如果你尝试运行它,这段代码实际上会崩溃。问题是在wrapped
(和wrapper
)这样的嵌套作用域中,您可以读取外部变量但不能将分配给它们。
这就是3.x中the nonlocal
keyword的含义(从delay
的单个调用中,wrapped
的所有“实例”都会retry
增加delay_lst = [delay]
。要在2.x中复制此内容,您需要执行delay_lst[0]
之类的操作,并将其作为wrapped
访问。
如果您希望修改属于delay
的本地修改,只需创建一个新变量并使用{{1}}的值对其进行初始化。