2012-06-06 2 views
2

here으로 설명하는 기능적 구문으로 데코레이터를 사용하고 있습니다.데코레이터에 할당되기 전에 로컬 변수가 참조됩니다.

dict의 목록을 반복합니다. 이 루프에서는 매개 변수를 사용하는 데코레이터를 사용하여 일반 함수를 래핑합니다. 그런 다음 매개 변수로 현재 dict로 래핑 된 함수를 호출합니다.

내 문제는 내가 local variable 'generic_evaluator' referenced before assignment 오류가 발생합니다. 여기

def log(logfile_name): 
    def inner_log(func): 
     def wrapped(*args, **kwargs): 
      import os 
      ret = func() 
      # business code... 
     return wraps(func)(wrapped) 
    return inner_log 

그리고 나는 log 장식과 generic_evaluator 기능을 포장 장소 :

당해 장식 :

여기 내 코드입니다.

for evaluation in generic_evaluations: 
    generic_evaluator = log(evaluation['suffix'])(generic_evaluator) 
    generic_evaluator(evaluation['suffix'], evaluation['id']) 

편집

그것은거야뿐만 아니라이 코드 조각 아마 더 명확하게 :

@tictoc 
def generic_evaluator(suffix_url, id): 
    xml = etree.parse(get_resource(base_url + "/" + suffix_url + "/" + str(id))) 
    links = fetch_urls_from_xml(xml) 
    return links 
+0

왜 효과가 있다고 생각하십니까? 여기 :'log (evaluation [ 'suffix']) (generic_evaluator)'아직 할당되지 않은 generic_evaluator를 사용하고 있습니다. 따라서 오류. 정확히 당신이 성취하고자하는 것은 무엇입니까? – Vikas

답변

2

경우 : 당신이 세계를 리 바인드하지 않으려면

global generic_evaluator 

을 , 이름을 다른 로컬 이름을 사용하고 초기화 :

local_generic_evaluator = generic_evaluator 

This answer는 무슨 일이 일어나고 있는지에 대한 설명을 제공합니다.

0
generic_evaluator = log(evaluation['suffix'])(generic_evaluator) 

현재 할당하기 전에 generic_evaluator를 기록 referrencing된다 (평가 [ 'suffix']) (generic_evaluator)

try th 입니다 : generic_evaluator는 전역 함수이며, 실제로 세계로이 이름을 선언, 글로벌 이름 generic_evaluator를 리 바인드 할

for evaluation in generic_evaluations: 
    generic_evaluator = log(evaluation['suffix'])(use_some_other_variable) 
    generic_evaluator(evaluation['suffix'], evaluation['id']) 
+0

''generic_evaluator''가 이미 정의 된 것을 잊어 버렸습니다. (내 편집보기) – renard

+0

이 줄에 문제가 생길 수 있습니다. generic_evaluator = log (평가 [ '접미사']) (generic_evaluator) – shiva

+0

다른 변수가 필요하지 않습니다. 그것은 여기에서 사용하는 함수 객체이며, 그것은 편집에서 말한 것처럼 이미 정의 된 함수입니다. – renard

관련 문제