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

У меня есть замечательная маленькая функция, которая выглядит так:

def verbose_print(message, *args, **kwargs):
    """Prints `message` with a helpful prefix when in verbose mode

    Args:
        message (str): The message to print. Can be a format string, e.g.
            `A %s with some %s in it`
        *args: Variables for the message format
        **kwargs: Keyword variables for the message format
    """

    # Only print when in verbose mode
    if not config.verbose:
        return

    # Ready a prefix for the message
    try:
        s = inspect.stack()
        module_name = inspect.getmodule(s[1][0]).__name__
        func_name = s[1][3]
        prefix = '### %s->%s' % (module_name, func_name)
    except Exception as e:
        prefix = '### [stack unavailable]'

    if args:
        message = message % args
    elif kwargs:
        message = message % kwargs

    print '%s: %s' % (prefix, message)

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

### avesta.webserver->check_login: Checking login for client at 127.0.0.1
### avesta.webserver->check_login: Found credentials cookie with username: tomas, token: blablabla
### avesta.webserver->check_login: Login valid, refreshing session
### avesta.webserver->get_flash_memory: Fetched flash data: None
### avesta.webserver->get: Fetched data from empty path ('previous_values', 'name'), returning ''
### avesta.webserver->get: Fetched data from empty path ('previous_values', 'description'), returning ''
### avesta.webserver->get: Fetched data from empty path ('validation_errors', 'name'), returning ''

Формат: "###модуль ->функция :сообщение" .

В большинстве случаев это действительно полезно, но не идеально. В приведенном выше примере функция «get» на самом деле является связанным методом класса, но это не видно. Что я пытаюсь сделать, так это то, что когда функция является связанным методом, я вместо этого печатаю в этом формате:

"###модуль ->ИмяКласса.функция"

Но проблема в том:

  1. Я получаю только имя функции из стека, поэтому я не могу проверить, является ли это связанным методом
  2. Даже если бы у меня была ссылка на функцию, как бы я экстраполировал имя класса, к которому она привязана?

Спасибо за любые ответы, которые могут помочь мне понять это.

5
задан Hubro 28 July 2012 в 23:23
поделиться