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