So ähnlich?
def multicall(*functions):
def call_functions(*args, **kwds):
for function in functions:
function(*args, **kwds)
return call_functions
Und wenn Sie die Ergebnisse aggregieren möchten:
def multicall(*functions):
def call_functions(*args, **kwds):
return [function(*args, **kwds) for function in functions]
return call_functions
EDIT
Zierer wurden vorgeschlagen; in diesem Fall würde es so aussehen:
def appendcalls(*functions):
def decorator(decorated_function):
all_functions = [decorated_function] + list(functions)
def call_functions(*args, **kwds):
for function in all_functions:
function(*args, **kwds)
return call_functions
return decorator
LOG = logging.getLogger(__name__)
@appendcalls(LOG.info)
def info(fmt, *args):
print fmt % args
info('Hello %s', 'guido')
appendcalls()
nimmt eine beliebige Anzahl von Funktionen nach der dekorierten Funktion aufgerufen werden. Sie möchten den Decorator möglicherweise anders implementieren, je nachdem, welchen Rückgabewert Sie wünschen - das Original aus der dekorierten Funktion, eine Liste aller Funktionsergebnisse oder gar nichts.
Warum tue ich das? Weil ich ein separates Modul geschrieben habe (nennen Sie es "ui.py"), das auf die Konsole schreibt ... und auch die Protokollierung verwendet, um Dinge zu protokollieren. Häufig wird die Nachricht, die auf der Konsole ausgegeben werden soll, ebenfalls protokolliert. –
Sie können das Logging-Modul dafür konfigurieren. Verwenden Sie einfach mehrere Handler und/oder Logger mit entsprechenden Ebenen. –
Logging-Modul ist nicht für textuelle UI .. Interaktion mit dem Benutzer konzipiert. zB: write_to_terminal könnte mit einem bereits angezeigten Fortschrittsbalken interagieren und ihn sogar verstecken (nur bzr tut das) –