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

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

Beitragvon Igor » Dienstag 13. November 2007, 11:00

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

Beitragvon HWK » Dienstag 13. November 2007, 15:10

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

Beitragvon Igor » Dienstag 13. November 2007, 15:22

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

Beitragvon Igor » Dienstag 13. November 2007, 16:43

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

Beitragvon BlackJack » Dienstag 13. November 2007, 17:23

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

Beitragvon Igor » Dienstag 13. November 2007, 17:27

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], brainstir