Seite 1 von 1
Name einer Methode innerhalb der Methode anzeigen
Verfasst: Freitag 26. April 2013, 08:41
von ddpf
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()
Re: Name einer Methode innerhalb der Methode anzeigen
Verfasst: Freitag 26. April 2013, 08:48
von Sirius3
Hallo ddpf,
was willst Du wirklich machen? Für was brauchst Du den Namen?
Re: Name einer Methode innerhalb der Methode anzeigen
Verfasst: Freitag 26. April 2013, 09:02
von ddpf
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.
Re: Name einer Methode innerhalb der Methode anzeigen
Verfasst: Freitag 26. April 2013, 09:37
von Sirius3
Hallo ddpf,
schau Dir mal an, wie es »traceback.extract_stack« macht.
Re: Name einer Methode innerhalb der Methode anzeigen
Verfasst: Freitag 26. April 2013, 11:48
von snafu
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...