Wie gebe ich zusätzliche Argumente, um eine Python-decorator?
Habe ich eine decorator wie folgt Aussehen.
def myDecorator(test_func):
return callSomeWrapper(test_func)
def callSomeWrapper(test_func):
return test_func
@myDecorator
def someFunc():
print 'hello'
Möchte ich zur Verbesserung dieser Dekorator zu akzeptieren, ein anderes argument, wie unten
def myDecorator(test_func,logIt):
if logIt:
print "Calling Function: " + test_func.__name__
return callSomeWrapper(test_func)
@myDecorator(False)
def someFunc():
print 'Hello'
Aber dieser code gibt den Fehler,
TypeError: myDecorator() takes exactly 2 arguments (1 given)
Warum wird die Funktion nicht automatisch weitergeleitet? Wie kann ich explizit übergeben Sie der Funktion, die an den Dekorator-Funktion?
balki: bitte vermeiden Sie die Verwendung von boolean als argument, es ist kein gd Ansatz und reduzieren-code readliability
es ist ein boolean-flag, also ein boolean-Wert ist der richtige Ansatz.
was ist "gd"? Ist es "gut"?
es ist ein boolean-flag, also ein boolean-Wert ist der richtige Ansatz.
was ist "gd"? Ist es "gut"?
InformationsquelleAutor balki | 2012-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie den Aufruf des Dekorateurs, wie eine Funktion, zu der es zurückkehren muss eine weitere Funktion, die die eigentliche decorator:
Der äußeren Funktion gegeben werden keine Argumente übergeben Sie ausdrücklich, und sollte die Rückkehr der inneren Funktion. Die innere Funktion übergeben werden, die Funktion zu schmücken, und die geänderte Funktion.
In der Regel will man das decorator zu ändern, das Verhalten der Funktion durch das einwickeln von es in einem wrapper-Funktion. Hier ist ein Beispiel, das Optional fügt Protokollierung, wenn die Funktion aufgerufen wird:
Den
functools.wraps
Aufruf kopiert Dinge wie den Namen und den docstring der wrapper-Funktion, machen es ähnlich wie die ursprüngliche Funktion.Beispiel:
functools.wraps
ist ratsam-es behält den ursprünglichen Namen, den docstring, etc. der umschlossene Funktion.Danke, ich habe dies nur Hinzugefügt, um das zweite Beispiel.
Also im Grunde Dekorateur dauert immer nur ein argument, nämlich die Funktion. Aber der Dekorateur kann ein Rückgabewert einer Funktion kann Argumente annehmen. Ist das richtig?
Ja, das ist richtig. Was verwirrt die Dinge ist, dass viele Menschen sich auch an den äußeren Funktion (
myDecorator
hier) ein Dekorateur. Dies ist bequemer für einen Benutzer, der Dekorateur, kann aber verwirrend sein, wenn Sie versuchen, eine zu schreiben.InformationsquelleAutor interjay
Nur um eine andere Sicht: die syntax
entspricht
Insbesondere
expr
werden können, was Sie wollen, solange es wertet ein callable. In insbesondere insbesondereexpr
kann ein decorator factory: Sie geben es einige Parameter, und es gibt Ihnen ein Dekorateur. Also vielleicht einen besseren Weg zu verstehen, Ihre situation so ist, wiekann dann gekürzt werden
Natürlich, da es sieht wie
decorator_factory
ist ein Dekorateur, Menschen neigen dazu, es zu benennen, zu reflektieren. Das kann verwirrend sein, wenn Sie versuchen, Folgen die Ebenen der Dereferenzierung.InformationsquelleAutor Katriel
Möchte nur hinzufügen einige nützliche trick, dass wird es ermöglichen, Dekorateur Argumente optional. Es wird auch alows, um die Wiederverwendung von decorator und verringern Schachteln
InformationsquelleAutor Alexey Smirnov
Nur eine andere Art zu tun, Dekorateure.
Ich finde diese Art am einfachsten zu wickeln meinem Kopf herum.
InformationsquelleAutor Robert Fey