pyflakes w804表示什么?

时间:2012-07-30 20:20:01

标签: python pyflakes

我正在开发一个装饰器,它将重试运行一个函数,最多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 已经分配了一个值,我可能应该能够将其作为我的参考。有人可以解释错误是什么,如果合理,我该如何修复它?

1 个答案:

答案 0 :(得分:5)

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

这就是3.x中the nonlocal keyword的含义(从delay的单个调用中,wrapped的所有“实例”都会retry增加delay_lst = [delay]。要在2.x中复制此内容,您需要执行delay_lst[0]之类的操作,并将其作为wrapped访问。

如果您希望修改属于delay的本地修改,只需创建一个新变量并使用{{1}}的值对其进行初始化。