Name einer Methode innerhalb der Methode anzeigen

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
ddpf
User
Beiträge: 21
Registriert: Freitag 22. Februar 2013, 12:13

Ich möchte den Namen von einer Methode rausfinden in dem ein Objekt erstellt wurde. Wie kann ich das machen? Siehe Code unten. Nach dem Aufruf von main möchte ich '__init__' ausgegeben sehen (oder wenn es in einer anderen Methode aufegrufen wurde, soll es der Methodenname sein).

Code: Alles auswählen

class Ueberclass():
    __init__(self):
    unter_object = Unterclass()
    unter_object.print_Ueberclass_name()

class Unterclass():
    def print_Ueberclass_name(self)
         print xxx #es soll der Name der Methode von der ueberclass ausgegeben werden

if __name__ == '__main__':
    ueber_object = Ueberclass()
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo ddpf,

was willst Du wirklich machen? Für was brauchst Du den Namen?
ddpf
User
Beiträge: 21
Registriert: Freitag 22. Februar 2013, 12:13

Ich arbeite an einem Test Frame Work. Benutze unittest und da habe ich eine Klasse geschrieben die Referenzvektoren und Testsignale mit einer zugehörigen Bedinugng einliest, feststellt ob alle Bedingungen erfüllt werden und zusätzlich eine nette Grafik, die aus einem oder mehren Subplots(Für jede Referenz eine) besteht, erstellt. Die Grafiken die erstellt werden benötigen einen Namen. Im Moment übergibt man den Namen im Konstruktor. Sprich einfach den Methodennamen. Das Ganze wird als Unit-Test aufgerufen und es wird ein zugehöriges xml-File erstellt. Das wird dann für Jenkins benötigt... und da brauche ich halt Grafik=Testname. Weil dahinter wieder eine fette Toolchain weiterläuft.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo ddpf,
schau Dir mal an, wie es »traceback.extract_stack« macht.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hm, grundsätzlich würde ich empfehlen, nach einem geeigneten Test-Framework zu suchen bzw einer Bibliothek für Reflexion, die deine Anforderungen erfüllt.

Falls man es denn wirklich selbst machen möchte, z.B. weil man nicht fertiges gefunden hat, dann wird's haarig und zum Teil auch abhängig von der verwendeten Python-Implementierung. So kann man mittels inspect.currentframe() zumindest unter CPython den aktuell oben auf dem Stack liegenden Frame holen. Mittels inspect.getframeinfo() lassen sich dann relativ bequem weitere Informationen aus diesem Frame holen. Das ganze kann in einem ersten Ansatz dann so aussehen (Ausgaben sind aus IPython):

Code: Alles auswählen

In [1]: from inspect import currentframe, getframeinfo

In [2]: class Foo(object):
   ...:     def foo(self):
   ...:         return getframeinfo(currentframe())
   ...:     

In [3]: f = Foo()

In [4]: f.foo()
Out[4]: Traceback(filename='<ipython-input-2-d28ecd2305e1>', lineno=3, function='foo', code_context=[u'        return getframeinfo(currentframe())\n'], index=0)

In [5]: f.foo().function
Out[5]: 'foo'
So kommst du also schonmal an den Namen der Methode. Jetzt geht es "nur noch" darum, wie ein Aufrufer bzw die von dir gewünschte Unterklasse an den entsprechenden Frame kommt. Dafür müsste ich jetzt sicherlich selber etwas länger recherchieren. Vielleicht weiß es ja jemand anders.

Jedenfalls ist das `inspect`-Modul ein ganz guter Ansatz für solche Probleme. Wie gesagt: Bevor du dir irgendwas zusammenhackst, prüfe vielleicht nochmal, ob ein entsprechendes Test-Framework sowas von Haus aus anbietet...
Antworten