Это хороший дизайн для создания логгера всего модуля в Python? - PullRequest
5 голосов
/ 17 августа 2010

При кодировании Python я часто использую модуль логирования.

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

Однако, ради простоты, я склоняюсь к тому, чтобы получить свой регистрирующий объект в самом начале файла модуля:

# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger('product.plugin.foo.bar')

Таким образом, мой регистратор доступен по всему миру, и я могу просто написать «logger.error ()» где угодно. Альтернатива - создать его для всего класса:

class Bar(object):
    logger = logging.getLogger('product.plugin.foo.bar')

Однако теперь мне приходится каждый раз вводить имя класса. Чтобы не вводить имя класса, у меня возникает соблазн использовать вместо этого «self», что не удастся в статических методах.

    def my_method(self):
        Bar.logger.error('foo')

    def my_method_2(self):
        self.logger.error('foo') # ok...

    @staticmethod
    def my_method_2():
        self.logger.error('foo') # boom!

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

Ответы [ 3 ]

7 голосов
/ 17 августа 2010

Всё хорошо. Я даже использую одно и то же имя переменной logger. Любое ведение журналов лучше, чем отсутствие журналирования, но я считаю, что only предоставляет хорошую переменную logger, хранит модуль скрытым, поэтому ваш код ссылается только на logger и, следовательно, на пространство имен, назначенное для модуль.

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

Update0

__all__ = [anything but logger]
import logging
logger = logging.getLogger("why.is.this.method.still.java.camel.case")
del logging

Принимая во внимание вклад С. Лотта ниже. Также обратите внимание, что обычно вы вообще не хотите from x import *.

1 голос
/ 17 августа 2010

Блин - я понял, что через секунду после того, как я написал этот вопрос, моя «альтернатива» на самом деле ничем не отличается: регистратор также создается во время импорта;)

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

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

Я бы создал объект logger в начале модуля и, возможно, даже использовал бы его в подмодулях, если это необходимо.

В любом случае, я мог бы все же создать дополнительный объект ведения журнала в большом классе, который использует ведение журнала.много, если я думаю, что это хорошая идея - например, когда я думаю, что это может быть полезно для настройки подробности ведения журнала или обработчиков ведения журнала отдельно для этого важного класса (например, класс для процессов упорядочения или для запросов к базе данных может быть таким случаем).

И вам не следует беспокоиться о том, что ваш объект журналирования доступен за пределами модуля.На самом деле, Python вообще не поддерживает частных пользователей.Я думаю, что Гидо ван Россум однажды написал что-то вроде: «Мы все взрослые, не так ли?».

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