Seite 1 von 1
Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 13:26
von endu
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?
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 13:37
von syntor
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.
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 13:40
von BlackJack
Ansonsten könnte man sich aufbauend auf `sys.settrace()` etwas basteln.
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 13:42
von syntor
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?
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 14:42
von 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.
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Donnerstag 9. Dezember 2010, 14:50
von syntor
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
Re: Suche Funktion für Funktionsaufrufprotokoll
Verfasst: Freitag 10. Dezember 2010, 13:09
von endu
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.