Форум сайта python.su
0
Можно ли дополнить информацию [(…, модуль, функция, строка, …)], полученную с помощью inspect.stack(), именем класса, если функция это метод?
Андрей, Москва
Python 3.3
Офлайн
568
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)
Офлайн
0
FishHook, спасибо. Вы показали как по ссылке на функцию узнать класс, который ее содержит.
Моя задача другая: как по стеку, полученнуму например при перехвате исключения, узнать в каких классах были вызваны функции.
Ваш пример содержит
callback.im_class.__name__
который не понимает мой Py3.3. Как исправить?
Может быть вы хотели написать так
callback.__class__.__name__
Но выдача получается такая
method class is method
method class is function
method class is function
Это не то даже для решения задачи “узнать имя класса по ссылке на метод”
Отредактировано kvichans (Март 7, 2013 12:23:40)
Офлайн
173
Приходит на ум вот такое:
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__)
Офлайн
0
reclosedev Это оказалось то, что нужно. Вот такой код
fr2 = inspect.stack()[2] try: cls = fr2[0].f_locals['self'].__class__.__name__ except: cls = ''
Офлайн