[Python-de] Funktion sucht Aufrufer

Heiko Wundram heikowu at ceosg.de
Fre Sep 10 12:52:54 CEST 2004


Am Freitag, 10. September 2004 10:17 schrieb Bertram Scharpf:
> kann eine Funktion feststellen, von wem sie aufgerufen
> wurde?

Ja. Dies ist aber immer relativ. Kurzes Beispiel:

>>> def f():
...   g()
...
>>> def g():
...   print inspect.getframeinfo(inspect.currentframe(1))
...
>>> import inspect
>>> f()
('<stdin>', 2, 'f', None, None)

<--- inspect.getframeinfo(inspect.currentframe(1))[2] wäre also der 
Funktionsname der aufrufenden Funktion.

>>> z = f
>>> z()
('<stdin>', 2, 'f', None, None)

<--- Der Name der aufrufenden Funktion ist f geblieben, obwohl die Funktion 
nicht über den Namen f, sondern über den Namen z angesprochen wird. Da aber 
in Python Namen eh nur Schall und Rauch sind, macht das keinen Unterschied. 
Der Funktionsname wird während des bearbeitens von def() gesetzt, bei 
Neubindung des Funktionsobjektes an einen anderen Namen (des selben 
Funktionsobjektes) wird er nicht neu gesetzt. Der Funktionsname kann über ein 
Attribut der Funktion abgefragt werden:

>>> f.func_name
'f'
>>> z.func_name
'f'

Für alle weiteren Infos zu getframeinfo() und currentframe() -> pydoc inspect.

HTH!

Heiko.

PS: Wenn Du solche "lowlevel"-Geschichten brauchst, ist das inspect-Modul 
immer extrem zuverlässig. Und verzichte auf solche Hacks, wie durch try: 1/0 
except: sys.exc_info().getframe() auf die Frames zuzugreifen, das geht auch 
alles mit einer etwas "higher-level" Schnittstelle, die inspect halt zur 
Verfügung stellt.