Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2016 19:46:31

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

Привет!
Хотел бы узнать можно ли получить имя класса и метода изнутри него самого? Не вбивая их ручками конечно
Пример
class TestCalss:
def test_method(self):
class_name = имя класса
def_name = имя метода

Спасибо

Офлайн

#2 Окт. 23, 2016 19:58:30

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

получение имени класса и мотода внутри этого же метода

  self.__class__.__name__



Офлайн

#3 Окт. 23, 2016 20:02:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

 class Ta:
    pass
class Tb:
    pass
def f(self):
    print(self, "qq")
g=f;
Ta.f = f
Tb.f = f
a = Ta()
b = Tb()
a.f()
b.f()

И что оно должно напечатать Ta или Tb? А как функция определит свое имя? У нее их два f, g и в любой момент может появиться сколько хочешь а может и вообще ни одного не быть. Можно inspect ом (https://docs.python.org/3/library/inspect.html) посмотреть какая текущая функция и найти ее в словаре от текущего класса. Но ой не уверен что это вам надо. Может то что вы ищете называется декораторы?



Отредактировано doza_and (Окт. 23, 2016 20:13:03)

Офлайн

#4 Окт. 23, 2016 20:22:11

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

ну на самом деле идея была сделать логгер который бы выдавал лог с указанием класса и метода в котором его вызвали. Что то типа
ERROR - 2016-10-23 11:20:07,986 - Имя класса - имя метода - Error - Текст ошибки
Возможно есть более правильные вариант…буду рад за подсказку

Офлайн

#5 Окт. 23, 2016 20:44:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

metotron
буду рад за подсказку
Будете смеяться но стандартный модуль logging это позволяет.

http://stackoverflow.com/questions/10973362/python-logging-function-name-file-name-line-number-using-a-single-file



Офлайн

#6 Окт. 23, 2016 20:58:12

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

у меня не получается сделать так “по дефолту”
вот код класса который я хочу вызывать а других местах для логгирования. Но я хочу app_name не писать руками, а получать от __name__ например

class MyLogger:

def __init__(self, test_run, app_name):
self.test_run = test_run
self.app_name = app_name

def logger(self):
formatter = logging.Formatter('%(levelname)s - %(asctime)s - %(name)s - %(message)s')

fh = logging.FileHandler("info.log")
fh.setFormatter(formatter)

ch = logging.StreamHandler()
ch.setFormatter(formatter)

# add handler to logger object
logger = logging.getLogger(self.app_name)
logger.setLevel(logging.INFO)

logger.addHandler(fh)
logger.addHandler(ch)
return logger

def debug_log(self, msg):
self.logger().debug("Here's some debugging information about %s", msg)

def info_log(self, msg):
self.logger().info("Here's some info about %s", msg)

def error_log(self, msg):
self.logger().error(msg)

def critical_log(self, msg):
self.logger().critical(msg)

Офлайн

#7 Окт. 23, 2016 21:42:21

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

Посмотрите про модули inspect, как предлагали выше, и на всякий случай про traceback.

Офлайн

#8 Окт. 23, 2016 21:48:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

получение имени класса и мотода внутри этого же метода

metotron
у меня не получается
Вы ссылочку то посмотрите там logging и inspect вместе используются



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version