Почему `args` в методе` warning` класса `Logger` необходим в Python? - PullRequest
1 голос
/ 18 марта 2020

Я могу использовать приведенный ниже код для записи журнала:

# method 1
>>> import logging
>>> user = "Jim"
>>> logging.warning("This is a warning from %s", user)
WARNING:root:This is a warning from Jim

Однако я также могу использовать удар кода, чтобы сделать то же самое:

# method 2
>>> import logging
>>> user = "Jim"
>>> logging.warning("This is a warning from %s" %user)
WARNING:root:This is a warning from Jim

Кажется, что Я всегда могу использовать метод 2 для записи журнала, и args в методе warning класса Logger не требуется?

Может кто-нибудь сказать мне, в чем разница между методом 1 и методом 2?

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Инфраструктура ведения журнала позволяет включать и выключать уровни в зависимости от уровня, на котором будет отправлено сообщение, и т. Д. c.

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

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

Содержимое строки будет одинаковым в любом случае. Основное различие заключается в том, когда аргументы интерполируются, а не как. Отложенная интерполяция (передача аргументов в логгер вместо того, чтобы делать это самостоятельно) намного эффективнее, когда некоторые уровни логирования или назначения отключены.

2 голосов
/ 18 марта 2020

Использование отдельного параметра args означает, что эти аргументы включены в LogRecord , который передается фильтрам, и вы (или кто-то еще) можете написать фильтр, который использует одно или несколько аргументов, или kwargs.

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

0 голосов
/ 18 марта 2020

В method1 предупреждение отформатирует строку для вас. В method2 вы сами отформатируете строку

...