2016-07-21 25 views
0

Ich lese this answer zu verstehen, was Dekorateure sind und was können sie tun, aus denen meine Frage hervorgeht. Der Autor bieten einen Bonus-Schnipsel, die jeder Dekorateur allgemein jedes Argument akzeptieren machen, und diese Schnipsel verwirrt mich wirklich:Was macht dieser Dekorateur Dekorateur?

def decorator_with_args(decorator_to_enhance): 
    def decorator_maker(*args, **kwargs): 
     def decorator_wrapper(func): 
      return decorator_to_enhance(func, *args, **kwargs) 
     return decorator_wrapper 
    return decorator_maker 

@decorator_with_args 
def decorated_decorator(func, *args, **kwargs): 
    def wrapper(function_arg1, function_arg2): 
     print "Decorated with", args, kwargs 
     return func(function_arg1, function_arg2) 
    return wrapper 

@decorated_decorator(42, 404, 1024) 
def decorated_function(function_arg1, function_arg2): 
    print "Hello", function_arg1, function_arg2 

decorated_function("Universe and", "everything") 

Diese Ausgänge:

Decorated with (42, 404, 1024) {} 
Hello Universe and everything 

Meine Frage ist: Was genau tut decorator_with_args tun?

Scheint, dass es einen Decorator als sein Argument braucht, wickle es mit einem Decorator Maker, der beliebige Argumente akzeptiert, die an den Argument-Decorator übergeben werden, und den Decorator Maker zurückgeben. Dies bedeutet, dass decorator_with_args tatsächlich einen Dekorateur in einen Dekorateurhersteller verwandelt. Klingt unmöglich, oder? Wie auch immer, ich denke, es ist schwierig, seine Funktion zu sagen.

Und ja, der ursprüngliche Code enthält viele Kommentare, aber ich habe es versäumt, die Antwort von ihnen zu bekommen, also habe ich sie entfernt, um den Code kürzer und sauberer zu machen.


+0

Denken Sie an Dekorateure nicht als etwas Besonderes. Die Zeile '@ decoraotor_with_args' ist syntaktischer Zucker zum Aufruf von 'decorated_decorator = decorator_with_args (decorated_decorator)' nach der Definition von' decorated_decorator'. Denken Sie daran, und diese Funktionen sind Objekte, die in Python weitergegeben werden können, und Sie sollten in der Lage sein, die Antwort selbst zu finden. – Phillip

+0

@Phillip Tatsächlich habe ich diesen Ausschnitt mehr als 5 Stunden lang angeguckt. Vielleicht bin ich gleich am Anfang falsch. Siehe: http://codereview.stackexchange.com/q/135482/96221 –

+0

@Phillip Hier ist meine aktuelle Idee: Was es tut, dreht eine Funktion, deren Argumentliste '(func, * args, ** kwargs)' ist eine andere Funktion, deren Argumentliste '(* args, ** kwargs)' ist. Das "verlorene" Argument "func" wird jedoch auf eine Weise gehandhabt, die ich jetzt nicht verstehen kann. –

Antwort

1

Kurz gesagt, decorator_with_args schaltet einen Funktionsaufruf wie folgt aus:

function(func, *args, **kwargs) 

dieser Form:

function(*args, **kwargs)(fund) 

Beachten Sie, dass beide Funktionsaufruf eine andere Funktion zurückzukehren.

+0

Ich würde * Funktionsaufruf * anstelle von * Funktion * schreiben. – Phillip

+0

@Phillip Bearbeitet. –