[teilgelöst] inspect.stack() => Klasse des Aufrufers

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
Igor
User
Beiträge: 8
Registriert: Donnerstag 15. Februar 2007, 13:16

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 :-)
Zuletzt geändert von Igor am Dienstag 13. November 2007, 16:43, insgesamt 1-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Igor
User
Beiträge: 8
Registriert: Donnerstag 15. Februar 2007, 13:16

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 :-)
Igor
User
Beiträge: 8
Registriert: Donnerstag 15. Februar 2007, 13:16

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 :-)
BlackJack

Schau Dich doch noch ein bisschen im `inspect`-Modul um. Da gibt's ein paar Testfunktionen, unter anderem `ismethod()`.
Igor
User
Beiträge: 8
Registriert: Donnerstag 15. Februar 2007, 13:16

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 :-)
Antworten