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 fordern decAny('xxx'). Aber decAny nimmt eine Funktion f0 sein, kein string. Also klar irgendwann, dass f0() 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 mit decAny selbst als Dekorateur. Aber wenn Sie @decAny(), dass die Berufung decAny 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 wie bold = 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).

InformationsquelleAutor ZEE | 2013-03-25
Schreibe einen Kommentar