Die übergabe eines Parameters an den Dekorator in python
Warum ist dieser Dekorator mit einem parameter funktioniert nicht?
def decAny( f0 ):
def wrapper( s0 ):
return "<%s> %s </%s>" % ( any, f0(), any )
return wrapper
@decAny( 'xxx' )
def test2():
return 'test1XML'
print( test2() )
gibt mir immer die Fehlermeldung "str ist nicht aufrufbar"
es wird versucht, führen Sie die return-string innerhalb des wrapper - ()
anstatt die Verarbeitung und das Ergebnis zurückzugeben string -
- Denken Sie an es auf diese Weise: Bevor Sie sich um die Dekoration
test2
Sie forderndecAny('xxx')
. AberdecAny
nimmt eine Funktionf0
sein, kein string. Also klar irgendwann, dassf0()
versuchen, rufen Sie'xxx'
. - Ok, aber wie in einem Dekorator verwendet keine Parameter, warum der compiler nicht davon ausgehen, dass der erste parameter ist die client-Funktion...
- Es ist nicht eine Frage der Parameter. Wenn Sie
@decAny
, das ist nur mitdecAny
selbst als Dekorateur. Aber wenn Sie@decAny()
, dass die BerufungdecAny
bevor Sie sich um die Dekoration, so wie@decAny('xxx')
ist. (Es ist genauso wie beim übergeben von Funktionen als Werte, speichern Sie Sie in Variablen, etc., im Gegensatz zu anrufen.) - "Sie fordern decAny('xxx'). Aber decAny nimmt eine Funktion f0, kein string" erklärt Die Parameter in den Dekorator übergeben werden sollte, um die client-Funktion... das würde Vereinfachung bringen und Intuitivität zu den decorators mit Parameter--- Dekorateure ohne Parameter funktionieren wie es sein sollte... das problem ist die definition für die Parameter die dem Dekorator in der... sollten Sie mehr verfeinert und vereinfacht...
- OK... ich glaube, ich sehe den Punkt... testen werde ich ein bisschen mehr mit dieser info an der hand...
- Der erste Entwurf der PEP tatsächlich gab fast Ihr genaues Beispiel, aber nach der Definition, so etwas wie Ihre
decAny
es dann Tat sich etwas wiebold = decAny('b')
,italic = decAny('i')
usw., das können Sie nur tun@bold
(ohne Parameter). Im Grunde der Grund, Dekorateure arbeiten wie dieser ist der gleiche Grund, nur Bezug zu einer Funktion gibt den Wert zurück, anstatt zu telefonieren (als Gegensatz zu, sagen wir, Ruby).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dekoratoren sind Funktionen, die Funktionen. Wenn "einen parameter übergeben, die an den Dekorator" was Sie tatsächlich tun, ist das aufrufen einer Funktion zurückgibt, die ein Dekorateur. So
decAny()
sollte eine Funktion zurückgibt, die eine Funktion zurückgibt, die eine Funktion.Es würde in etwa so Aussehen:
Beispiel:
Beachten Sie, dass zusätzlich zu Befestigung der spezifische problem, das Sie waren zu schlagen, ich verbesserte auch Ihren code ein bisschen durch hinzufügen
*args
und**kwargs
als Argumente für die umschlossene Funktion und übergeben Sie auf derf0
Aufruf innerhalb der Dekorateur. Das macht es so können Sie dekorieren eine Funktion akzeptiert eine beliebige Anzahl von positions-oder benannte Argumente, und es wird noch richtig funktionieren.Lesen Sie über
functools.wraps()
hier:http://docs.python.org/2/library/functools.html#functools.wraps
synchronize
usw.).*args, **kwargs
zu verbessern, seinen code (ohne zu erklären, warum), werden Sie wahrscheinlich wollen Sie auch hinzufügenfunctools.wraps
.functools.wraps
und einige weitere Erklärung.partial
oder definieren Sie einen lokalen Verschluss ohne Gebäude eine andere Schicht auf der Oberseite mit einer Fabrik.Es ist ein gutes Beispiel von "Mark Lutz - Learning Python" - Buch: