Hallo,
ich suche eine Möglichkeit, mit der ich innerhalb einer Methode/Funktion abfragen kann, welches Modul (noch besser welche Methode/Funktion) sie aufgerufen hat?
Beispiel
Ich habe zwei Funktionen: ModulA.Fx und ModulB.Fy
Ich ruf von Fx die Funktion Fy aus ModulB auf. Nun möchte ich in Fy wissen, daß der Aufruf von ModulA bzw. Funktion Fx kam.
Ich möchte mitloggen, wer und wann eine Funktion aufgerufen wurde und möchte diese Information nicht bei jedem Aufruf mitgeben (zuviele Änderungen in bestehendem Quellcode).
Gibt es so eine Möglichkeit, oder muss ich mir etwas anderes einfallen lassen?
Gruß
Nergal
Traceback Funktionsaufruf: wer hat die Funktion aufgerufen
Um zu sehen ob es funktioniert, habe ich folgendes in einer Methode eingebaut:
Der Output ist allerdings jedes Mal
Habe es auch mit sys.last_traceback probiert, allerdings bekomme ich dann den Fehler, daß das Modul kein Attribut last_traceback hat.
Momentan steh ich voll auf'm Schlauch.
Gruß
Nergal
Code: Alles auswählen
import traceback
import sys
tb = sys.exc_info()[2]
print tb
traceback.format_tb(tb)
Code: Alles auswählen
<traceback object at 0x011AD788>
None
Momentan steh ich voll auf'm Schlauch.
Gruß
Nergal
Ich nehme mal an, daß du
oder sowas in der Art suchst. Läßt sich sicherlich auch noch aufhübschen. Um bei deinem Beispiel zu bleiben: Für ein TraceBack-Objekt ist offensichtlich keine __repr__ oder ähnliches definiert, weshalb 'print tb' nicht so viel Sinn macht. Bei deiner letzten Zeile geht die Ausgabe einfach verloren, weil das 'print' davor fehlt.
Code: Alles auswählen
print traceback.print_stack(tb)
Nö, dann wird er nur ausgegeben. Der Callstack wird immer mitgeführt, sonst wüsste der Interpreter nicht, wohin er nach einer Funktion zurückspringen sollte. Mit dem traceback-Modul kommt man da jeder Zeit ran.snafu hat geschrieben:Aber der Traceback kommt doch nur bei einem Fehler (Exeption), oder nicht? Wie ich ihn verstehe, will er generell wissen, von wo aus eine Funktion aufgerufen wurde.
Das Leben ist wie ein Tennisball.
Also ich benkomme vernünftige Ergebnisse:
Code: Alles auswählen
traceback.extract_stack()
Das Leben ist wie ein Tennisball.
Also Galileo Computing definiert "Traceback" so:
Ich weiß allerdings nicht, wieviel Wert man dieser Aussage beimessen kann, da das Buch hier von vielen als "problematisch" (milde gesagt) angesehen wird.
Aber auch die Doku zu [mod]traceback[/mod] sagt ja:
Und auch zu sys.last_traceback:
QuelleEin Traceback-Objekt hält den Kontext fest, aus dem eine Exception geworfen wurde, und liefert damit die Informationen, die bei einem Traceback auf dem Bildschirm angezeigt werden. Zu diesen Informationen gehört vor allem die Funktionshierarchie, der sogenannte Callstack. Ein Traceback-Objekt wird beim Werfen einer Exception automatisch erzeugt.
Ich weiß allerdings nicht, wieviel Wert man dieser Aussage beimessen kann, da das Buch hier von vielen als "problematisch" (milde gesagt) angesehen wird.
Aber auch die Doku zu [mod]traceback[/mod] sagt ja:
Folglich käme man an ein `traceback`-Objekt und damit an den Stack nur dann, wenn eine Exception geworfen wird. Das scheint mir aber wie gesagt nicht im Sinne des OP's zu sein...The module uses traceback objects — this is the object type that is stored in the variables sys.exc_traceback (deprecated) and sys.last_traceback and returned as the third item from sys.exc_info().
Und auch zu sys.last_traceback:
...und eben nicht grundsätzlich nach jedem Aufruf einer Funktion/Klasse/usw.[...] set when an exception is not handled and the interpreter prints an error message
Du könntest – anstatt wilde Vermutungen anzustellen – ja mal die letzten beiden Beispiele in der traceback-Doku lesen oder einfach den Interpreter anwerfen 
