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.
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
@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 –
@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. –