Frage

Als Beispiel

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

Das Problem, das ich habe ist, wird der @get_booking Dekorateur auch genannt wird, bevor ich die Funktion aufgerufen, die ich zu dekorieren.

Ausgabe am Start:

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

Ich habe nicht einmal einen Anruf an eine Funktion aus, das an dieser Stelle eingerichtet wird.

Ich bin gerade mit Dekorateure getting started, vielleicht etwas, was ich bin fehlt. Jede Hilfe?

War es hilfreich?

Lösung

Ich glaube, Python Dekorateure ist nur syntaktischer Zucker.

@foo
def bar ():
    pass

ist dasselbe wie

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

Wie Sie sehen können, foo genannt wird, obwohl bar noch nicht aufgerufen wurde. Dies ist, warum Sie die Ausgabe von Ihrer Dekorateur Funktion zu sehen. Die Ausgabe eine einzige Zeile für jede Funktion enthalten, sollten Sie Ihren Dekorateur angewendet wird.

Andere Tipps

Da Sie mit Dekorateure beginnen, ich glaube, das Lesen diese hilfreich sein wird, so dass Sie die Fallen und Abhilfen vorher wissen.

Hier sind zwei Links zu früheren Diskussionen über Dekorateure.

Python Dekorateur macht Funktion vergessen dass sie gehört zu einer Klasse Was bedeutet functools.wraps tun?

Darüber hinaus ist die zweite Verbindung erwähnt ‚functools‘ ein Modul für Funktionen höherer Ordnung, die auf Handlungen oder andere Funktionen zurückzukehren. Die Verwendung von functools.wraps wird empfohlen, da es den doc-String der ursprünglichen Funktion (verziert eins) bewahrt.

Ein weiteres Problem war falsche Methode Signaturen während der automatischen docs Generierung für mein Projekt. aber es gibt eine Abhilfe: Erhaltung Unterschriften von dekorierten Funktionen

Hope, das hilft.

ist ein Dekorateur, sobald die eingerichtete Funktion definiert bezeichnet. Es ist gleichwertig, so etwas zu schreiben:

def __do_stuff(...):
    ...

do_stuff = get_booking(__do_stuff)

Python Dekorateure sind Funktionen auf eine Funktion angewendet es zu transformieren:

@my_decorator
def function (): ...

ist wie dies zu tun:

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

Was Sie tun möchten, ist:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top