rausfinden von wem eine funktion aufgerufen wurde

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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo... wie der Titel schon sagt, wuerde ich gern wissen, von wo eine Funktion aufgerufen wurde. Also einmal vom Framework direkt oder von einer meiner bestehenden Funktionen.

Also kann das beispielsweise meine Funktion bla() rausfinden, ohne das ihr ihr nen Parameter uebergeben muss?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Geht etwa so:

Code: Alles auswählen

In [40]: def showcaller():
   ....:     print sys._getframe(1).f_code.co_name
   ....:
In [41]: def mycaller():
   ....:     showcaller()
   ....:
In [49]: mycaller()
mycaller
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

ah... dankeschoen... das ich mir das getframe aber auch nie vor augen halte :)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Und ich würde es als Hack bezeichnen, den man besser nicht in Produktionscode benutzt. Wozu brauchst Du das?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, ´´sys._getframe´´ ist ein interessantes Werkzeug, daher ist in dessen Dokumentation auch eine Warnung drin und es beginnt mit einem Unterstrich:
_getframe-Dokumentation hat geschrieben:This function should be used for internal and specialized purposes only.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ramin
User
Beiträge: 8
Registriert: Sonntag 15. Mai 2005, 15:07

Interessant, getframe kannte ich nicht, ich verwende in solchen Fällen immer:

Code: Alles auswählen

import traceback
print traceback.print_stack(limit=3)
Alles Gute
Ramin
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Etwas einfacher:

Code: Alles auswählen

# which module did a function come from?

import inspect
from math import *  # sin() etc.

def test():
    pass

print inspect.getmodule(test).__name__  # __main__
print inspect.getmodule(sin).__name__   # math
Atomkraftwerkaktienbesitzer
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Ene Uran hat geschrieben:Etwas einfacher:

Code: Alles auswählen

# which module did a function come from?

import inspect
from math import *  # sin() etc.

def test():
    pass

print inspect.getmodule(test).__name__  # __main__
print inspect.getmodule(sin).__name__   # math
Das ist aber nicht, was nkoehring wollte.

Ich bin für die _getframe Lösung. Das was du willst klingt nach Debugging und dafür sind Frame Objekte wie geschaffen.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

übrigens... erstmal danke fuer all die weiteren antworten... aber ich muss auch zugeben, dass ich die _getframe-Methode perfekt fuer meine ansprueche find :)

aber naja... spricht nix dagegen nochmehr moeglichkeiten aufzuzaehlen...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten