Chcę użyć danych wyjściowych pprint, aby pokazać złożoną strukturę danych, ale chciałbym wyprowadzić je za pomocą modułu logowania, a nie standardowego wyjścia.
Przejrzałem dokumenty i znalazłem pprint( {}, stream ), ale stwierdziłem, że jest to raczej niezręczne. pomyślałbym, że coś takiego spprintmogłoby być ładniejsze niż pformat(jak w c).
yee379
6
pprint.pformat()był na tej stronie.
Gareth Latty
27
@Lattywayre - Nie każdy, kto zadaje takie pytanie, pomija dokumenty. Czytałem te same dokumenty, a także brakowało formatu pformat. W przepływie stosu czasami otrzymujesz klejnoty z doświadczeń innych ludzi, których w ogóle nie było w dokumentach. Dzięki yee379 za pytanie.
Mnebuerquo
Odpowiedzi:
218
Użyj, pprint.pformataby uzyskać ciąg, a następnie wyślij go do struktury rejestrowania.
from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
Jeśli nie usuniesz tego kodu po zakończeniu debugowania, prawdopodobnie powinieneś chronić go za pomocą „if Logger.isEnabledFor (logging.DEBUG):”, aby uniknąć uruchamiania pformat, gdy nie będziesz używać jego wyniku: docs.python. org / 2 / library /…
Ed Brannin
2
@EdBrannin Czy pformat dodaje tyle narzutów, że warto dodać warunki warunkowe do wszystkich instrukcji dziennika DEBUG?
undefinedvariable
2
@undefinedvariable Dobre pytanie. Ja-dziś chce powiedzieć mi-2 lata temu, żeby wygenerować pewne wskaźniki wydajności A / B.
Ed Brannin,
1
Mam AttributeError: 'function' object has no attribute 'pformat'pojęcie, dlaczego?
JinSnow
3
rozwiązanie: potrzebowałem from pprint import pprint,pformat wtedylogging.debug((pformat(stuff))
JinSnow
20
Powyższe rozwiązanie nie do końca mi się podoba, ponieważ używam również programu formatującego do dodawania nazwy i nazwy poziomu podczas logowania. Wygląda trochę nieporządnie:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__ : DEBUG : Some other logging text
Może być bardziej eleganckie rozwiązanie, ale to:
for line in pprint.pformat(ds).split('\n'):
logging.debug(line)
tworzy coś ładniejszego:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa',
__main__ : DEBUG : 'bbbbbbbbbbbbbbbbbbbb',
__main__ : DEBUG : 'cccccccccccccccccccc',
__main__ : DEBUG : 'dddddddddddddddddddd']
__main__ : DEBUG : Some other logging text
Ładniejszy do spożycia przez ludzi. Niezbyt dobre, jeśli wysyłasz logi do logstash lub podobnych narzędzi i chcesz, aby wysłano jedną wiadomość wielowierszową, a także jedną wiadomość.
Charles Duffy
5
czy jest sposób, aby ładnie wydrukować na poziomie obsługi / programu formatującego konfiguracji rejestratora? Wydaje się, że jest to ważny przypadek użycia, aby ładnie wydrukować na konsoli, ale nie sformatowano do pliku
jon_darkstar
@CharlesDuffy Czy istnieje łatwy sposób na załatwienie obu spraw?
jtlz2
2
Fwiw, moim rozwiązaniem jest dodanie dodatkowego \nznaku do formatu. Przynajmniej w ten sposób blok jest razem.
pprint( {}, stream )
, ale stwierdziłem, że jest to raczej niezręczne. pomyślałbym, że coś takiegospprint
mogłoby być ładniejsze niżpformat
(jak wc
).pprint.pformat()
był na tej stronie.Odpowiedzi:
Użyj,
pprint.pformat
aby uzyskać ciąg, a następnie wyślij go do struktury rejestrowania.from pprint import pformat ds = [{'hello': 'there'}] logging.debug(pformat(ds))
źródło
AttributeError: 'function' object has no attribute 'pformat'
pojęcie, dlaczego?from pprint import pprint,pformat
wtedylogging.debug((pformat(stuff))
Powyższe rozwiązanie nie do końca mi się podoba, ponieważ używam również programu formatującego do dodawania nazwy i nazwy poziomu podczas logowania. Wygląda trochę nieporządnie:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccc', 'dddddddddddddddddddd'] __main__ : DEBUG : Some other logging text
Może być bardziej eleganckie rozwiązanie, ale to:
for line in pprint.pformat(ds).split('\n'): logging.debug(line)
tworzy coś ładniejszego:
__main__ : DEBUG : ['aaaaaaaaaaaaaaaaaaaa', __main__ : DEBUG : 'bbbbbbbbbbbbbbbbbbbb', __main__ : DEBUG : 'cccccccccccccccccccc', __main__ : DEBUG : 'dddddddddddddddddddd'] __main__ : DEBUG : Some other logging text
źródło
\n
znaku do formatu. Przynajmniej w ten sposób blok jest razem.