2014-11-18 6 views
0

최근에 파이썬에서 데코레이터에 대해 배우기 시작했고 다음 코드 조각이 혼란 스럽습니다. 이것이이 질문을하기에 좋은 곳인지 잘 모르겠습니다. 친절하게 나랑 벗었 어. 데코레이터의 작동 방식 이해

HANDLERS = {} 

def handler_for(template): 
    def decorator(f): 
     HANDLERS[template] = f 
     return f 
    return decorator 

def get_template(template, **kwargs): 
    #This function got me all confused. How does HANDLERS.get(template, None) works and how does it return demo_func() function? 
    return HANDLERS.get(template, None) 

def email(template, **kwargs): 
    handler = get_template(template, **kwargs) 
    contents = handler(**kwargs) 
    print contents 

@handler_for('demo') 
def demo_func(**kwargs): 
    #Do something and return the String 

if __name__ == "__main__": 
    email('demo') 

는 파이썬 디버거와 디버깅을 시도했지만 나는 여전히 get_template() 함수는 함수 이름을 반환하는 장식 호출하는 방법으로 혼란스러워지고 있어요. 어떤 도움이라도 대단히 감사하겠습니다.

+0

[이 질문] (http://stackoverflow.com/questions/26981310/decorator-with-parameters/26981383#26981383)은 찾고있는 모든 것을 설명합니까,하지 않습니까? – abarnert

+0

@abarnert : 조사하고 있습니다. – user95025

+0

좋아요, 거기에 내 설명이 더 좋을 것 같습니다 (플러스, 다른 사람이 다른 좋은 설명이 있습니다). 질문에 직접 관련이 없더라도 문제를 해결하기에 충분하다면이 문제를 해결하는 것이 좋습니다. 복제. 그러나 그렇지 않다면 여기 내 대답을보십시오. – abarnert

답변

0

파이썬 디버거를 사용하여 디버깅을 시도했지만 get_template() 함수가 함수 이름을 반환하는 데코레이터를 호출하는 방법과 여전히 혼동을 느낍니다.

음 ... 그렇지 않습니다. 데코레이터는 @handler_for('demo')을 사용하여 호출됩니다. 다음과 같은 것을 명심 동일하면

장식, 그들은 보이는만큼 복잡하지 않은 : 단지 식별자 일 필요는 없습니다

@beans 
def spam(eggs): 
    print(eggs) 

def spam(eggs): 
    print(eggs) 
spam = beans(spam) 

beans 그건, 그것은 할 수있다 (거의) 모든 표현식, 심지어 함수 호출. 그래서, 당신의 코드는이 일을한다 :

demo_func = handler_for('demo')(demo_func) 

handler_fortemplate 매개 변수의 값으로 'demo' 걸립니다. 그런 다음 로컬 함수 인 decorator을 정의하고 반환합니다. 그래서 호출 될 때 자신의 인수 인 f에 접근 할 수 있으며, 생성 된 시점의 닫힌 값 template 값에 액세스 할 수 있습니다. 이 함수는 즉시 demo_func과 함께 f 값으로 호출되며, HANDLERS 사전의 함수를 숨기고 변경되지 않은 상태로 반환합니다. 따라서, 인라인 모든 : 나중에이 demo_func를 찾을 수 get_template('demo')를 호출 할 때

def demo_func(**kwargs): 
    #Do something and return the String 
template = 'demo' 
HANDLERS[template] = demo_func 
demo_func = demo_func 

그래서, get_template 때문에 그냥 HANDLERS에 물건을 보인다.