Как выполнить logging.debug с оператором?

Я пытался перестать использовать операторы печати для отладки и начать использовать logging.debug. Я могу использовать оператор в печати, но ведение журнала, похоже, не делает то же самое.

Например, это работает

print('Is between now and then:    ', solar_noon < now < solarnoonplustimeunit )

а это не так.

logger.debug('Is between now and then:    ', solar_noon < now < solarnoonplustimeunit )

Последний говорит:

Traceback (most recent call last):
  File "/usr/lib/python2.7/logging/__init__.py", line 859, in emit
    msg = self.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 732, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 471, in format
    record.message = record.getMessage()
  File "/usr/lib/python2.7/logging/__init__.py", line 335, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting

Как мне провести операторский тест с логированием?

Первый аргумент - это строка формата. Попробуй в конце добавить %s!

Klaus D. 01.05.2018 22:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Методы модуля регистрации ожидают, что первый аргумент будет строкой формата, а следующие аргументы будут принадлежать этой строке формата: logger.debug(fmt_str, arg1,....). Но в вашей строке нет никаких указаний на то, что за ней последуют другие элементы.

то есть функция logger.debug в конечном итоге попытается сделать что-то вроде этого:

fmt_str % (arg1, arg2, ...)


Попробуйте просто добавить формат str %s:

logger.debug('Is between now and then:    %s', solar_noon < now < solarnoonplustimeunit )


Редактировать: Почему ваша исходная строка работает с print:

Согласно документы:

print(*objects, sep=' ', end='\n', file=sys.stdout)

Print objects to the stream file, separated by sep and followed by end. sep, end and file, if present, must be given as keyword arguments.

All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end. Both sep and end must be strings; they can also be None, which means to use the default values. If no objects are given, print() will just write end.

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

Я предполагаю, что Print принимает строку и печатает ее?

Rich 01.05.2018 22:34

@Rich - к моему ответу добавлено объяснение поведения print

xgord 01.05.2018 22:46

Другие вопросы по теме