문제

예로서,

def get_booking(f=None):
    print "Calling get_booking Decorator"
    def wrapper(request, **kwargs):
        booking = _get_booking_from_session(request)
        if booking == None:
            # we don't have a booking in our session.
            return HttpRedirect('/')
        else:
            return f(request=request, booking=booking, **kwargs)
    return wrapper

@get_booking
def do_stuff(request, booking):
    # do stuff here

내가 가진 문제는, @get_booking 데코레이터가 내가 장식하는 기능을 불러 내기 전에 호출되는 것입니다.

시작시 출력 :

Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
[26/Oct/2008 19:54:04] "GET /onlinebooking/?id=1,2 HTTP/1.1" 302 0
[26/Oct/2008 19:54:05] "GET /onlinebooking/ HTTP/1.1" 200 2300
[26/Oct/2008 19:54:05] "GET /site-media/css/style.css HTTP/1.1" 200 800
[26/Oct/2008 19:54:05] "GET /site-media/css/jquery-ui-themeroller.css HTTP/1.1" 200 25492

나는이 시점에서 장식 된 함수를 호출하지도 않았다.

나는 방금 데코레이터를 시작하고 있기 때문에 뭔가 빠졌을 수도 있습니다. 도움이 있습니까?

도움이 되었습니까?

해결책

나는 파이썬 데코레이터가 단지 구문 설탕이라고 생각합니다.

@foo
def bar ():
    pass

같은 것입니다

def bar ():
    pass
bar = foo(bar)

보시다시피 foo 그래도 호출되고 있습니다 술집 호출되지 않았습니다. 이것이 당신이 당신의 데코레이터 기능의 출력을 보는 이유입니다. 출력에는 데코레이터를 적용한 모든 기능에 대해 단일 라인이 포함되어야합니다.

다른 팁

당신이 데코레이터로 시작하기 때문에, 나는 이것을 읽는 것이 도움이 될 것이라고 생각합니다. 그래서 당신은 미리 함정과 해결 방법을 알 수 있습니다.

다음은 데코레이터에 대한 이전 토론에 대한 두 가지 링크입니다.

파이썬 데코레이터는 기능이 클래스에 속한다는 것을 잊게 만듭니다. functools.wraps는 무엇을합니까?

또한 두 번째 링크는 'FuncTools'가 고차 기능을위한 모듈을 언급하고 다른 기능을 수행하거나 반환합니다. funcTools.wraps의 사용은 원래 함수의 DOC 문자열 (장식 된)을 보존하기 때문에 권장됩니다.

또 다른 문제는 내 프로젝트의 자동 문서를 생성하는 동안 잘못된 방법 서명이었습니다. 그러나 해결 방법이 있습니다.장식 된 기능의 서명을 보존합니다

도움이 되었기를 바랍니다.

장식 된 기능이 정의되는 즉시 데코레이터가 호출됩니다. 다음과 같은 글을 쓰는 것과 같습니다.

def __do_stuff(...):
    ...

do_stuff = get_booking(__do_stuff)

파이썬 데코레이터는 그것을 변환하기 위해 함수에 적용되는 함수입니다.

@my_decorator
def function (): ...

이것을하는 것과 같습니다.

def function():...
function = my_decorator(function)

당신이하고 싶은 것은 다음과 같습니다.

def get_booking(f=None):
    def wrapper(request, **kwargs):
        print "Calling get_booking Decorator"
        booking = _get_booking_from_session(request)
        if booking == None:
            # we don't have a booking in our session.
            return HttpRedirect('/')
        else:
            return f(request=request, booking=booking, **kwargs)
    return wrapper
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top