Условная регистрация в питоне - PullRequest
3 голосов
/ 16 августа 2011

Я хочу включить ведение журнала в модуле, но я не хочу, чтобы модуль создавал новый объект / файл журнала, я хочу, чтобы он использовал объект журнала вызывающих абонентов, что бы это ни было, но только если они проходят один , Я знаю, что могу поместить все свои вызовы журнала в блок try, но это неудобно. То, что я наконец-то придумал, похоже, работает, но кажется довольно глупым, и я уверен, что есть лучший способ сделать это.

class MyClass(object):
    def __init__(self, arg1, arg2, log=None):
        if log == None:
            class log(object):
                def error(self, msg): pass
                def warning(self, msg): pass
                def info(self, msg): pass
                def debug(self, msg): pass
            self.log = log()
        else:
            self.log = log
        self.log.debug('Starting')

Какой лучший способ сделать что-то подобное?

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Большинство регистраторов используют шаблон фабрики, чтобы позволить некоторым централизованным ресурсам управлять тем, какие классы (если таковые имеются) получают регистраторы, которые фактически регистрируют (вместо вызова фиктивных функций).Это означает, что существует централизованный API, централизованное управление, и нет необходимости определять регистраторы для каждого класса отдельно.

Обычно рекомендуется просматривать переданные параметры как сигнал от одного к другому: «Вам нужно использовать этот объект, чтобы выполнил свою работу ».Если MyClass не является регистратором, на самом деле не имеет смысла передавать его в качестве параметра - ему не нужен регистратор, чтобы выполнять свою работу, если это плохо.

0 голосов
/ 17 августа 2011

предпочтительный шаблон:

import logging
LOGGER = logging.getLogger(__name__)

class MyClass(object):
    logger = LOGGER

    def do_something(self, somesuch):
        self.logger.debug("Starting %s", somesuch)

myInstance = MyClass()
if need_fancy_logging:
    myInstance.logger = logging.getLogger("FancyLogger")

myInstance.do_something("blabla")

РЕДАКТИРОВАТЬ: стандартный logging модуль действительно действительно все делает правильно, в том числе и ничего.

Python 2.7 (r27:82500, Sep 16 2010, 18:03:06) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> log = logging.getLogger('foo')
>>> log.debug('debug')
>>> log.info('info')
>>> log.error('error')
No handlers could be found for logger "foo"
>>> log.error('error')
>>> 

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

0 голосов
/ 16 августа 2011

Используйте функции, предоставляемые модулем logging напрямую, т. Е .:

logging.debug('Starting')

и предоставьте вызывающему абоненту возможность изменить корневой логгер, если они этого захотят.

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