Уведомления

Группа в Telegram: @pythonsu

#1 Март 7, 2013 11:16:26

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнать имя класса при проходе по стеку вызовов?

Можно ли дополнить информацию [(…, модуль, функция, строка, …)], полученную с помощью inspect.stack(), именем класса, если функция это метод?

Андрей, Москва
Python 3.3



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Офлайн

#2 Март 7, 2013 11:32:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как узнать имя класса при проходе по стеку вызовов?

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)



Офлайн

#3 Март 7, 2013 12:09:10

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнать имя класса при проходе по стеку вызовов?

FishHook, спасибо. Вы показали как по ссылке на функцию узнать класс, который ее содержит.
Моя задача другая: как по стеку, полученнуму например при перехвате исключения, узнать в каких классах были вызваны функции.

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

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




Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Отредактировано kvichans (Март 7, 2013 12:23:40)

Офлайн

#4 Март 7, 2013 13:40:32

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Как узнать имя класса при проходе по стеку вызовов?

Приходит на ум вот такое:

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__)
Возможно есть более правильный способ.

Офлайн

#5 Март 7, 2013 14:32:27

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнать имя класса при проходе по стеку вызовов?

reclosedev Это оказалось то, что нужно. Вот такой код

	fr2 = inspect.stack()[2]
	try:
		cls = fr2[0].f_locals['self'].__class__.__name__
	except:
		cls = ''
позволил мне узнать имя класса, когда из его метода были сделаны два вызова.



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version