Seite 1 von 1
[teilgelöst] inspect.stack() => Klasse des Aufrufers
Verfasst: Dienstag 13. November 2007, 11:00
von Igor
Hallo zusammen,
Ich versuche gerade, die Klasse der Methode zu ermitteln, die 'meine' Funktion aufgerufen hat. Es geht dabei um ein kleinen Logger.
Bis jetzt klappt das hier ganz gut:
Code: Alles auswählen
import inspect
def log():
function=inspect.stack()[1][3]
linenumber=inspect.stack()[1][2]
print function, ", ", linenumber
class C:
def test(self):
log()
c = C()
c.test()
Ausgabe: 'test , 9'
Mir fehlt aber noch der Klassen-Name 'C'.
Ich habe die gesammte Doku zu frame und code aus dem inspect durch und google schon gequählt, leider ohne erfolg.
Ich würde mich sehr freuen, wenn mir jemand helfen kann!
Liebe Grüße
Igor
Verfasst: Dienstag 13. November 2007, 15:10
von HWK
Das wäre zumindest eine Lösung:
Code: Alles auswählen
import inspect
def log(inst):
function=inspect.stack()[1][3]
linenumber=inspect.stack()[1][2]
print '%s, %s, %s' % (function, linenumber, inst.__class__)
class C:
def test(self):
log(self)
c = C()
c.test()
MfG
HWK
Verfasst: Dienstag 13. November 2007, 15:22
von Igor
Hihi,
danke für die Antwort. Das ist die jetzige Lösung, und die will ich durch eine ohne Instanz-Übergabe ablösen
Trotzdem Danke!
Grüße
Igor
Verfasst: Dienstag 13. November 2007, 16:43
von Igor
Ich hab gerade folgende unschöne Lösung ersonnen:
Code: Alles auswählen
import inspect, types
def log():
classname = None
frame = inspect.stack()[1][0]
# Pruefe, ob die aufgerufene Funktion mindestens einen Parameter uebernimmt
if len(frame.f_code.co_varnames) > 0:
# Pruefe, ob der erste Parameter 'self' heisst
if frame.f_code.co_varnames[0] == 'self':
o = frame.f_locals['self']
# Pruefe, ob self eine Instanz ist
if type(o) == types.InstanceType:
classname = o.__class__.__name__
function=inspect.stack()[1][3]
linenumber=inspect.stack()[1][2]
print function, ", ", linenumber, ', ', classname
Folgende Probleme:
- Klappt nicht für statische Methoden
- Klappt nicht, wenn der erste Parameter nicht self heißt
- Klappt nicht, wenn ich eine einfache Funktion schreibe, deren erster Parameter self heißt.
- Ist weder sauber noch schön.
Also wenn jemand andere Lösungen hat, bitte bitte her damit!
Grüße
Igor
Verfasst: Dienstag 13. November 2007, 17:23
von BlackJack
Schau Dich doch noch ein bisschen im `inspect`-Modul um. Da gibt's ein paar Testfunktionen, unter anderem `ismethod()`.
Verfasst: Dienstag 13. November 2007, 17:27
von Igor
Hab ich schon, die Methoden hab ich auch schon gefunden. Aber ich hab im Frame nix gefunden, was ich in diese Methoden reinstecken kann.
Es gibt dort kein Method-Objekt, welches von der isMethod-Funktion als solches erkannt wird. Und Beispiele sind auf der Python-Seite und in ganz google nicht zu finden!
Danke für die Antwort!
igor