gpt4 book ai didi

python - pyflakes w804 表示什么?

转载 作者:行者123 更新时间:2023-11-28 22:02:15 25 4
gpt4 key购买 nike

我正在开发一个装饰器,它将重试运行函数最多 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 local variable 'delay' (defined in enclosing scope on line x) referenced before assignment

这对我来说意义不大。 delay 被分配了一个值,我想我应该能够随心所欲地引用它。谁能解释错误是什么,如果合理的话,我该如何解决?

最佳答案

如果您尝试运行这段代码,它实际上会崩溃。问题是在像 wrapped(和 wrapper)这样的嵌套作用域中,您可以读取外部变量但不能赋值给他们。

这就是the nonlocal keyword在 3.x 中是为了(这将使 delaywrapped 的所有“实例”中从一次调用 retry 增加)。要在 2.x 中复制它,您需要执行类似 delay_lst = [delay] 的操作并以 delay_lst[0] 访问它。

如果您希望对wrapped 进行局部修改,只需创建一个新变量并使用delay 的值对其进行初始化即可。

关于python - pyflakes w804 表示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11728960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com