Ich habe eine Funktion Convenience-Funktion Wrapper für eine andere Funktion (bar
). foo
ruft bar
auf, führt dann weitere Aufgaben an der Ausgabe aus. Zum Beispiel:Halten von Funktionsaufrufsignaturen für eine Funktion, die eine Obermenge von Argumenten einer anderen Funktion akzeptiert
def bar(bar_arg, bar_kw=None):
#do some stuff
return ret
def foo(bar_arg, foo_arg, bar_kw=None, foo_kw=None):
ret = bar(bar_arg, bar_kw)
ret.some_method(foo_arg, foo_kw=foo_kw)
würde ich den Anruf Signatur für foo
gerne die Schlüsselwörter und Argumente von bar
enthalten, so dass ein Benutzer foo
weiß, was Inspizieren sie passieren können, jedoch würde ich die vollständige Liste der vermeiden, wie die Aufrechterhaltung Argumente selbst seit bar
tendenziell zu ändern, wie das Paket, aus dem es kommt, aktualisiert wird und seine Argumentliste ist lang. Seit foo
ruft immer bar
mit der vollständigen Liste der Argumente und Schlüsselwörter, die bar
akzeptiert, ich sehe nicht, dass ich die Liste selbst pflegen sollte.
Gibt es eine Möglichkeit, die Anrufsignatur für foo
basierend auf der Anrufsignatur für bar
aufzubauen? Gibt es außerdem eine Möglichkeit, die Eingaben in foo
in einem Wörterbuch oder Namespace zu erfassen, so dass ich die Argumente und Schlüsselwörter, die von foo
verwendet werden, leicht von denen trennen kann, die von bar
verwendet werden?
Hinweis, ich weiß über * Args und ** Kwargs. Sie lassen jedoch die Funktionssignatur mehrdeutig und informieren den Benutzer nicht darüber, welche Argumente und Schlüsselwortargumente zulässig sind.
Edit: Ich sollte beachten, dass mein Anwendungsfall wesentlich komplexer als dieses Beispiel ist. Die aufgerufene externe Funktion (bar
) lautet matplotlib.colorbar.ColorbarBase
. Die aufrufende Funktion (foo
) ist eine Klassenmethode für eine Zeichenklasse, die in zahlreichen eigenen Anwendungen verwendet wird, die andere wahrscheinlich in Zukunft verwenden werden. foo
erstellt eine Farbleiste, führt dann zusätzliche Arbeit an der Farbleiste durch, basierend auf zusätzlichen Argumenten und Schlüsselwörtern, die von ColorbarBase
nicht akzeptiert werden.
Sie können * wahrscheinlich * einen Dekorateur haben (der die 'bar'-Referenz als Argument erhält), tun Sie das für Sie. – SuperSaiyan
Ich denke du meinst "ret.some_method", und auch "return ret". –
@Alex Danke, bearbeitet. – Vorticity