Suche Funktion für Funktionsaufrufprotokoll

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
endu
User
Beiträge: 9
Registriert: Dienstag 31. März 2009, 13:43

Hiho,

ich bin auf der Suche nach einer Möglichkeit, ein Protokoll meiner Funktionsaufrufe beim Programmablauf zu erstellen.
Wichtig ist die zeitliche Abfolge und die übergebenen Werte.

bei cProfile und trace konnte ich eine passende Funktionalität nicht finden, und bin schon fast so weit, in jede Funktion als erste Zeile ein print mit Funktionsnamen und den übergebenen Parameterwerten zu schreiben, was allerdings wohl nicht optimal sein kann.

Kennt jemand eine effizientere Lösung?
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Mit Decorators ginge das sehr gut, du musst aber explizit angeben bei welchen Funktionen du das haben möchstest. Der Vorteil ist aber, dass du den Body deiner Methode nicht verändern musst, sondern nur die Signatur.

Update

Hier ist ein guter Artikel über Decorators (englisch)

Update

Und noch ein Artikel, der sich direkt auf deinen Anwendungsfall beziehen sollte.
Zuletzt geändert von syntor am Donnerstag 9. Dezember 2010, 13:41, insgesamt 2-mal geändert.
BlackJack

Ansonsten könnte man sich aufbauend auf `sys.settrace()` etwas basteln.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

BlackJack hat geschrieben:Ansonsten könnte man sich aufbauend auf `sys.settrace()` etwas basteln.
Und dann via ein traceback? Ist es nicht langsam, ständige tracebacks zu machen?
BlackJack

@syntor: Tracebacks? An die Informationen sollte man mit Hilfe des `inspect`-Moduls kommen:

Code: Alles auswählen

from inspect import getargvalues, getframeinfo


def trace(frame, event, arg):
    if event in ['call', 'c_call']:
        frame_info = getframeinfo(frame)
        arg_values = getargvalues(frame)
        print frame_info, arg_values
Die Werte in den beiden Objekten müsste man wahrscheinlich noch ein bisschen aufbereiten. Und natürlich bremst dass das Programm aus. Genau wie das `trace`-Modul, welches auch `sys.settrace()` verwendet.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Ich wusste nur nicht genau, wie man es in Python genau anstellt ;)
Get information about a frame or traceback object. A 5-tuple is returned, the last five elements of the frame’s frame record.

Changed in version 2.6: Returns a named tuple Traceback(filename, lineno, function, code_context, index).
http://docs.python.org/library/inspect. ... tframeinfo
endu
User
Beiträge: 9
Registriert: Dienstag 31. März 2009, 13:43

Erstmal danke für die guten Antworten.
Ich werd das mal ausprobieren und mich, wenn ich weitere Fragen habe wieder melden.

Die Geschwindigkeitseinbußen sind mir an dieser Stelle egal, da ich das Ablaufprotokoll eh nur zum Debuggen und Dokumentieren nutzen will.
Antworten