Я просмотрел документы и нашел pprint( {}, stream ), но нашел это довольно неудобным. я бы подумал, что что-то вроде spprintмогло быть лучше, чем pformat(как в c).
yee379
6
pprint.pformat()был на той странице.
Gareth Latty
27
@Lattywayre - Не все, кто задает подобный вопрос, пропустили документы. Я читал те же документы, а также пропустил формат. В stackoverflow вы также иногда получаете жемчужины опыта других людей, которых вообще не было в документации. Спасибо yee379 за вопрос.
Mnebuerquo 08
Ответы:
219
Используйте, pprint.pformatчтобы получить строку, а затем отправить ее в свою платформу ведения журнала.
from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
Если вы не удалите этот код после завершения отладки, вам, вероятно, следует защитить его с помощью «if Logger.isEnabledFor (logging.DEBUG):», чтобы избежать запуска pformat, когда вы не будете использовать его вывод: docs.python. org / 2 / library /…
Эд Браннин
2
@EdBrannin Добавляет ли pformat столько накладных расходов, что стоит проблем с добавлением условий ко всем операторам журнала DEBUG?
undefinedvariable
2
@undefinedvariable Хороший вопрос. Я-сегодня хочет сказать мне-2-летней давности, чтобы я сгенерировал некоторые показатели эффективности A / B.
Эд Браннин,
1
Я понимаю, AttributeError: 'function' object has no attribute 'pformat'почему?
JinSnow
3
решение: мне from pprint import pprint,pformat тогда нужноlogging.debug((pformat(stuff))
JinSnow
20
Приведенное выше решение не совсем мне помогло, потому что я также использую форматировщик для добавления имени и имени уровня при регистрации. Выглядит немного неопрятно:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__ : DEBUG : Some other logging text
Может быть более элегантное решение, но это:
for line in pprint.pformat(ds).split('\n'):
logging.debug(line)
производит что-то более приятное:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa',
__main__ : DEBUG : 'bbbbbbbbbbbbbbbbbbbb',
__main__ : DEBUG : 'cccccccccccccccccccc',
__main__ : DEBUG : 'dddddddddddddddddddd']
__main__ : DEBUG : Some other logging text
Лучше для человеческого потребления. Не так хорошо, если вы отправляете журналы в logstash или аналогичные инструменты и хотите, чтобы одно многострочное сообщение отправлялось как одно сообщение.
Чарльз Даффи
5
Есть ли способ красиво распечатать на уровне обработчика / форматтера конфигурации регистратора? Похоже на допустимый вариант использования для красивой печати на консоль, но без
форматирования
@CharlesDuffy Есть ли простой способ справиться с обоими случаями?
jtlz2
2
Fwiw мое решение состояло в том, чтобы просто добавить дополнительный \nсимвол в pformat. По крайней мере, так блок вместе.
pprint( {}, stream )
, но нашел это довольно неудобным. я бы подумал, что что-то вродеspprint
могло быть лучше, чемpformat
(как вc
).pprint.pformat()
был на той странице.Ответы:
Используйте,
pprint.pformat
чтобы получить строку, а затем отправить ее в свою платформу ведения журнала.from pprint import pformat ds = [{'hello': 'there'}] logging.debug(pformat(ds))
источник
AttributeError: 'function' object has no attribute 'pformat'
почему?from pprint import pprint,pformat
тогда нужноlogging.debug((pformat(stuff))
Приведенное выше решение не совсем мне помогло, потому что я также использую форматировщик для добавления имени и имени уровня при регистрации. Выглядит немного неопрятно:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccc', 'dddddddddddddddddddd'] __main__ : DEBUG : Some other logging text
Может быть более элегантное решение, но это:
for line in pprint.pformat(ds).split('\n'): logging.debug(line)
производит что-то более приятное:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa', __main__ : DEBUG : 'bbbbbbbbbbbbbbbbbbbb', __main__ : DEBUG : 'cccccccccccccccccccc', __main__ : DEBUG : 'dddddddddddddddddddd'] __main__ : DEBUG : Some other logging text
источник
\n
символ в pformat. По крайней мере, так блок вместе.