2009-09-19 4 views
0

초기 코드가 혼동하여 편집 중입니다.장식자는 부작용이 없어야합니까?

는 내가 장식 deco 부작용이있는 경우

#I would use either of these 
#Option 1 
def bar(*args): 
    pass 
foo = deco(bar) 

#Option2 
@deco 
def foo(*args): 
    pass 

그러나,이 보장되지 않으므로,이 두 가지가 동일한 것으로 가정한다. partcicular,이 내 ecpectation가 장식 (NO 부작용)를 형성했다, 나는
#Option1 
def bar(*args): 
    pass 
foo = register.filter(bar) 

#Option 2 
@register.filter 
def foo(val, arg): 
    pass 

그래서 내 기대 잘못, 또는과 일치되는 장고이며, 측면 effct 하나를 가로 질러 와서 그것에 의해 물린 모범 사례?

+0

짐 후구 닌 2004에서 스레드가 그렇게 생각하는 것 같다. http://mail.python.org/pipermail/python-dev/2004-April/044133.html – agiliq

+0

아래 질문에서 질문을 했으므로 바를 추가 할 수 있습니다. – agiliq

+0

예제는 이해가되지 않습니다. 왜냐하면 당신이 정의한 foo를 버리기 때문입니다. 당신은 데코를 사용하여 foo를 꾸미므로 새로운 foo를 얻을 수 있습니다. – hop

답변

2

사실,이 모두 정확히 동일합니다

def foo(*args): 
    pass 
foo = deco(foo) 

@deco 
def foo(*args): 
    pass 

당신이 bar을 장식하고 foo를 호출 할 경우, foo = deco(bar) 올바른 방법입니다. 그것은 말합니다 : "bar이라는 이전에 정의 된 것을 장식하고 그것을 foo"이라고 부르십시오. 데코레이터 구문의 포인트는 정의 앞에 랩핑 기능을 명시하고 이름을 바 Y 기는 것입니다.

나중에 bar을 사용해야하는 경우가 아니면 다른 이름으로 장식 해제 된 함수를 호출 할 이유가 없습니다. 이렇게하면 데코레이터 구문 설탕을 사용할 수있는 능력을 잃어 버리게됩니다.

deco은 기능 일 필요는 없습니다. 이는 __call__ 메서드를 사용하는 객체 일 수 있습니다.이 메서드는 부작용을 정확하게 캡슐화하는 데 유용합니다.

+0

@roberto : 정확하게. 내 주장은'foo = deco (bar)'와 정확히 일치해야만합니다. – agiliq

+0

도대체'bar'는 무엇입니까? 데코레이터'deco'는'foo' 메소드를 래핑하고'foo = deco (foo)'와 정확히 동일합니다. 왜 당신은'foo = deco (bar)'에 대해 계속 묻고 있습니까? 아마도 당신의 이러한 오해가 근본적인 문제입니다. – PaulMcG

+0

bar는 다른 호출 가능합니다. 데코 (바)의 retirn 값을 foo에 바인드하고 싶습니다. – agiliq

0

예는 모든 경우에 동일한 것을 표현하지 않습니다. 왜 당신은 술집 사용을 주장합니까?

귀하의 첫 번째 예를 보자

#Option 1 
def bar(*args): 
    pass 
foo = deco(bar) 

#Option2 
@deco 
def foo(*args): 
    pass 

옵션 1을한다 (문자 그대로)

foo = deco(bar) 

하지만, 옵션 2

foo = deco(foo) 

당신이 차이를 볼 수 없습니다

하는 것과 동일 그곳에?

간단히 말해서, 예 : 귀하의 가정과 귀하의 기대가 잘못되었습니다. 당신이 당신의 함수의 장식되지 않은 버전뿐만 아니라 장식을해야하는 경우

, 단지 미리 저장 :

def foo(*args): 
    pass 
bar = foo 
foo = deco(foo) 
+0

> 왜 술집 사용을 고집합니까? 장식 된 것과 장식되지 않은 두 가지 기능에 액세스해야하기 때문에. 내 가정은 (분명히) 잘못되었습니다. 그런데 부작용이 없다고 내 기대가 왜 자유롭지? – agiliq

+0

왜 그런 임의의 규칙으로 자신을 제한하겠습니까? – hop

+0

Library(). register()를 등록하는 것 외에는 func 할 일을합니까? foo는 이전과 이후에 동일해야합니다 ... – hop

관련 문제