Python - получить статическую информацию - PullRequest
1 голос
/ 24 мая 2009

Мне нужно получить статическую информацию от одного «модуля» к другому. Я пытаюсь написать логгер с информацией о месте кода, откуда мы регистрируемся. Например, в каком-то файле:

LogObject.Log('Describe error', STATIC_INFORMATION)

Статическая информация - это имя класса, имя файла и имя функции. Я получаю это от этого:

__file__ 
self.__class__.__name__ 
sys._getframe().f_code.co_name

Но я не хочу записывать эти переменные во время регистрации. Могу ли я создать какую-то функцию и вызвать ее. Например:

LogObject.Log('Describe error', someFunction())

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

Ответы [ 2 ]

3 голосов
/ 24 мая 2009

Я не думаю, что "статичный" - это мир, который вы ищете. Если я вас правильно понимаю, вы хотите написать функцию, которая будет возвращать имя файла, имя класса и имя метода вызывающей стороны.

По сути, вы должны использовать sys._getframe (1) для доступа к предыдущему кадру и работать оттуда.

Пример:

def codeinfo():
    import sys
    f = sys._getframe(1)

    filename = f.f_code.co_filename
    classname = ''

    if 'self' in f.f_locals:
        classname = f.f_locals['self'].__class__.__name__

    funcname = f.f_code.co_name

    return "filename: %s\nclass: %s\nfunc: %s" % (filename, classname, funcname)

Тогда откуда-нибудь из метода можно написать

logger.info("Some message \n %s" % codeinfo())
2 голосов
/ 24 мая 2009

Во-первых, пожалуйста, используйте строчные имена для объектов и методов. Используйте только имена UpperCase для определений классов.

Что еще более важно, вам нужна умная интроспективная функция в каждом классе.

class Loggable( object ):
    def identification( self ):
        return self.__class__.__module__, self.__class__.__name__, sys._getframe().f_code.co_name

class ARealClass( Loggable ):
    def someFunction( self ):
        logger.info( "Some Message from %r", self. identification() )

Если все ваши классы являются подклассами Loggable, вы будете наследовать эту функцию идентификации во всех классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...