2012-07-30 3 views
2
나는 다음과 같이 N 시간에 함수를 실행 재 시도하는 장식하고 있어요

: 코드가 합리적인 보이지만 라인에 나에게pyflakes w804는 무엇을 의미합니까?

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 강조는보고, 불평 :

(라인 X의 범위를 둘러싸에 정의)

W804 지역 변수 '지연' 이 매우 나에게 이해가되지 않습니다 할당

전에 참조. delay에 값이 할당되어 있으며이를 참고할 수있을 것입니다. 누군가가 오류가 무엇인지 설명하고 합리적이라면 어떻게 해결할 수 있습니까?

+1

앞으로이 문제가 발생하면 [PEP 3104] (http://www.python.org/dev/peps/pep-3104/)에서 제한 사항에 대해 자세히 설명합니다. –

답변

5

이 코드는 실행하면 실제로 충돌합니다. 문제는 wrapped (및 wrapper)과 같은 중첩 된 범위에서 외부 변수를 읽을 수 있지만 이 아닙니다.

이것은 3.X에서 the nonlocal keyword은 (retry에 단일 통화에서 wrapped의 모든 "인스턴스"에서 delay 증가 할 것이다)을위한 것입니다. 2.x에서 이것을 복제하려면 delay_lst = [delay]과 같은 것을 수행하고 delay_lst[0]으로 액세스해야합니다.

수정 사항을 wrapped에 국한 시키려면 새 변수를 만들고 delay 값으로 초기화하십시오.

+0

아, 왜 그런지 이해가 안되네요.하지만 당신이 언급하는 기술은 [내가 뽑은 코드]에 나와 있습니다. (http://wiki.python.org/moin/PythonDecoratorLibrary#Retry) 파이썬 위키에서. –

관련 문제