2016-08-15 6 views
-2

Я ленив и хочу, чтобы избежать этой строки в каждом файле питон, который использует протоколирование:Избегайте `логгер = logging.getLogger (__ имя __)`, не теряя способ фильтрации бревна

logger = logging.getLogger(__name__) 

В январе я спросил, как это может быть сделано, и нашел ответ: Avoid `logger=logging.getLogger(__name__)`

К сожалению, ответ имеет недостаток, что вы теряете способность фильтровать.

Я действительно хочу избежать этой бесполезной и избыточной линии.

Пример:

import logging 

def my_method(foo): 
    logging.info() 

К сожалению, я думаю, что это невозможно сделать logger = logging.getLogger(__name__) неявно, если logging.info() вызывается в первый раз в этом файле.

Есть ли кто-нибудь, кто знает, как сделать невозможный материал?

Update

Мне нравится Don't Repeat Yourself. Если большинство файлов содержат одну и ту же строку вверху, я думаю, что это повторение. Это выглядит как WET. Переводчик python в моей голове должен пропустить эту строку каждый раз, когда я там смотрю. Мое субъективное чувство: эта линия бесполезна. Строка должна быть неявным значением по умолчанию.

+0

Действительно ли это, что трудно * определить, что * одна строка * в верхней части вашего модуля? Вам уже пришлось вводить 'import logging'. –

+0

@MartijnPieters Я не печатаю «журнал импорта». У меня есть IDE, которая делает это. Я набираю «logging. [MAGIC-KEY-STROKE]» в методе, а среда IDE вставляет оператор импорта вверху. Да, я не хочу набирать эту строку. Это раздувается. Я хочу меньше кода, а не больше. – guettli

+2

Это не раздувание; это явное объявление о том, что вы хотите, чтобы объект журнала с этим именем. В пакете вы можете повторно использовать этот логгер для всех подмодулей, если вам не нравится это имя. Вы можете легко использовать различную иерархию имен. Более того, для чего-либо еще потребуется специальный подкласс класса с пользовательским '__getattr__', который затем проверяет фрейм вызовов для ключа' __name__' в глобалях для создания одного и того же объекта. Python предпочитает быть явным из-за такой магии. –

ответ

1

Подумайте, если вы действительно хотите это сделать.

Создать модуль, например. magiclog.py так:

import logging 
import inspect 

def L(): 
    # FIXME: catch indexing errors 
    callerframe = inspect.stack()[1][0] 
    name = callerframe.f_globals["__name__"] 
    # avoid cyclic ref, see https://docs.python.org/2/library/inspect.html#the-interpreter-stack 
    del callerframe 
    return logging.getLogger(name) 

Тогда вы можете сделать:

from magiclog import L 
L().info("it works!") 
+0

Прохладный, это выглядит как первый шаг. Теперь это должно быть выполнено, если я выполняю 'import logging' и' logging.info («он работает!») ' – guettli

+1

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

1

Я ленив и хочу, чтобы избежать этой строки в каждом файле питона, который использует протоколирования:

logger = logging.getLogger(__name__) 

Ну, это рекомендуемый способ:

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

logger = logging.getLogger(__name__) 

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

Это цитата из официального howto.

Мне нравится Не повторяться. Если большинство файлов содержат одну и ту же строку на вершине, я думаю, что это повторение. Это похоже на WET.Python переводчик в моей голове должен пропустить эту строку каждый раз, когда я смотрю . Мое субъективное чувство: эта линия бесполезна. Строкой должно быть неявное значение по умолчанию.

Из этого следует, что «Явное лучше, чем неявное». В любом случае вы можете легко изменить шаблон python во многих IDE, чтобы всегда включать эту строку или создавать новый файл шаблона.

+1

И теперь что-то совершенно другое, но не воспринимайте это слишком серьезно: глазированные носки рекомендовали несколько лет назад. Каждая хорошая домохозяйка сделала это. Большинство людей перестало это делать. – guettli

+1

У меня есть 99 проблем программирования, но явный однострочный набор для настройки регистрации не один. Это мой несерьезный ответ. –

Смежные вопросы