Найти - Пользователи
Полная версия: Как узнать имя класса при проходе по стеку вызовов?
Начало » Python для новичков » Как узнать имя класса при проходе по стеку вызовов?
1
kvichans
Можно ли дополнить информацию [(…, модуль, функция, строка, …)], полученную с помощью inspect.stack(), именем класса, если функция это метод?

Андрей, Москва
Python 3.3
FishHook
class Foo(object):
    def method(self):
        pass
def action(callback):
    try:
        print "method class is", callback.im_class.__name__
    except AttributeError:
        print "callback is not a method",
foo = Foo()
action(foo.method)
action(Foo.method)
action(action)
kvichans
FishHook, спасибо. Вы показали как по ссылке на функцию узнать класс, который ее содержит.
Моя задача другая: как по стеку, полученнуму например при перехвате исключения, узнать в каких классах были вызваны функции.

Ваш пример содержит
callback.im_class.__name__
который не понимает мой Py3.3. Как исправить?

Может быть вы хотели написать так
callback.__class__.__name__
Но выдача получается такая
method class is method
method class is function
method class is function
Это не то даже для решения задачи “узнать имя класса по ссылке на метод”


reclosedev
Приходит на ум вот такое:
import sys
  
class Foo(object):
    def method(self):
        1/0
  
a = Foo()
try:
    a.method()
except Exception as e:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    frame = exc_traceback.tb_next.tb_frame
    print("Class name:", frame.f_locals['self'].__class__.__name__)
Возможно есть более правильный способ.
kvichans
reclosedev Это оказалось то, что нужно. Вот такой код
	fr2 = inspect.stack()[2]
	try:
		cls = fr2[0].f_locals['self'].__class__.__name__
	except:
		cls = ''
позволил мне узнать имя класса, когда из его метода были сделаны два вызова.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB