Використовуйте протокол друку виводу pprint


101

Я хочу використовувати висновок pprint, щоб показати складну структуру даних, але я хотів би вивести його за допомогою модуля реєстрації, а не stdout.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

я переглянув документи і знайшов pprint( {}, stream ), але виявив це досить незручно. я міг би подумати, що щось подібне spprintмогло бути приємнішим ніж pformat(як у c).
yee379

6
pprint.pformat()була на цій сторінці.
Gareth Latty

27
@Lattywayre - Не кожен, хто задає подібне запитання, пропустив документи. Я читав ті самі документи, а також пропускав pformat. У Stackoverflow ви також іноді отримуєте дорогоцінні камені з досвіду інших людей, яких взагалі не було в документах. Дякую yee379 за запитання.
Mnebuerquo

Відповіді:


214

Використовуйте, pprint.pformatщоб отримати рядок, а потім надішліть його до вашого журналу.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
Якщо ви не видалите цей код після завершення налагодження, вам слід захистити його, якщо "Logger.isEnabledFor (logging.DEBUG):", щоб уникнути запуску pformat, коли ви не будете використовувати його вихідні дані: docs.python. org / 2 / library /…
Ед Браннін,

2
@EdBrannin Чи додає pformat стільки накладних витрат, що варто клопоту додавати умовні умови до всіх операторів журналу DEBUG?
undefinedvariable

2
@undefinedvariable Гарне запитання. Me-today хоче сказати Me-2-years-ago генерувати деякі показники 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

14
Приємніше для споживання людиною. Не так вже й добре, якщо ви відправляєте журнали до logstash або подібних інструментів і хочете, щоб одне багаторядкове повідомлення було надіслано як одне повідомлення.
Чарльз Даффі,

5
чи є спосіб гарного друку на рівні обробника / форматування конфігурації реєстратора? Здається, це справжній випадок використання симпатичного друку на консолі, але неформатований файл
jon_darkstar

@CharlesDuffy Чи є простий спосіб вирішити обидва випадки?
jtlz2

1
Моїм рішенням було просто додати зайвий \nсимвол у pformat. Принаймні, таким чином блок є разом.
ricekab
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.