Seite 1 von 1
Wie Original-Argumente von dekorierter Funktion anzeigen?
Verfasst: Montag 19. Dezember 2011, 12:19
von snafu
Zur Erstellung eines Dekorators verwende ich das typische Idiom mit
functools.wraps():
Code: Alles auswählen
>>> def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print 'Calling decorated function'
... return f(*args, **kwds)
... return wrapper
...
>>> @my_decorator
... def example():
... """Docstring"""
... print 'Called example function'
Ruft man ein `help()` oder bei IPython das Fragezeichen für die dekorierte Funktion auf, dann erscheint auch erwartungsgemäß der Original-Docstring und der Original-Name der Funktion in der Signatur. Was aber fehlt, sind die Original-Argumente. Stattdessen steht dort nur `(*args, **kwds)`.
Wie bekomme ich es also hin, dass `functools.wraps()` auch die Argumente korrekt übernimmt? Oder anders: Was muss ich den `WRAPPER_ASSIGNMENTS` anfügen, damit es funktioniert?
Re: Wie Original-Argumente von dekorierter Funktion anzeigen
Verfasst: Montag 19. Dezember 2011, 16:42
von snafu
Anscheinend doch nicht so trivial. Ich werde mich wohl am
Quellcode des
decorator-Moduls orientieren. Dort passieren die für mich relevanten Dinge offenbar in der `update`-Methode des `FunctionMaker`s. Auf dieser Grundlage schreibe ich mir dann halt meinen eigenen Wrapper-Dekorator, der auch wirklich möglichst alles wrappt. Für die paar Zeilen möchte ich nicht unbedingt das besagte Paket zur Abhängigkeit machen. Melde mich dann wahrscheinlich nochmal, wenn der Dekorator fertig ist.

Re: Wie Original-Argumente von dekorierter Funktion anzeigen
Verfasst: Montag 19. Dezember 2011, 17:37
von lunar
@snafu: Ist doch Blödsinn, seine eigene Lösung zu erfinden, wenn es eine perfekte Lösung bereits gibt. Zumal es mit ein paar Zeilen nicht getan ist, da "decorator" im Wesentlichen Quelltext erzeugen und kompilieren muss, um die Signatur der dekorierten Funktion in den Dekorator zu übernehmen, da die Signaturen von Funktionsobjekten in CPython unveränderlich sind.
Re: Wie Original-Argumente von dekorierter Funktion anzeigen
Verfasst: Montag 19. Dezember 2011, 22:53
von snafu
lunar hat geschrieben:[...] da die Signaturen von Funktionsobjekten in CPython unveränderlich sind.
Achso, das hatte ich nicht bedacht bzw wusste es nicht. Ich war schon verwundert, wieso im `decorator`-Quelltext noch soviel drumherum gemacht wird.
Re: Wie Original-Argumente von dekorierter Funktion anzeigen
Verfasst: Dienstag 20. Dezember 2011, 04:39
von Leonidas
Jo, finde das decorator-Modul, nein, falsch, die Funktionalität sollte in functools aufgenommen werden. Weil so sind Dekoratoren etwas verkrüppelt.
Re: Wie Original-Argumente von dekorierter Funktion anzeigen
Verfasst: Dienstag 20. Dezember 2011, 07:44
von snafu
Leonidas hat geschrieben:Jo, finde das decorator-Modul, nein, falsch, die Funktionalität sollte in functools aufgenommen werden. Weil so sind Dekoratoren etwas verkrüppelt.
Find ich irgendwie auch. Möglicherweise kann man schon direkt an der Implementierung in CPython was machen, denn als sauber würde ich die Lösung, die `decorator` geht, nicht unbedingt bezeichnen. Wird aber vermutlich seinen Sinn haben, warum das mit der Unveränderlichkeit der Argumente (oder besser gesagt: der Signatur) so geregelt ist. Evtl bringt ja hier lunar oder jemand anders Licht ins Dunkel...
