2013-05-19 19 views
9

Standardowy moduł pprint jest miły, gdy zajmuje się listami, dyktami i tak dalej. Ale czasami zupełnie bezużyteczne z niestandardowych klasach:Python 3.x: alternatywna implementacja pprint

  • Jedynym sposobem, aby go wydrukować użyteczną informację o obiekcie pewnej klasie jest przesłonić __repr__, ale co jeśli moja klasa już ładne, eval() „stanie __repr__ który jest nie wyświetlając informacji, które chcę zobaczyć w pprint ouput?

  • Ok, będę pisać do druku zorientowanych __repr__, ale w tym przypadku niemożliwe jest całkiem-print coś wewnątrz mojej klasy:

.

class Data: 
    def __init__(self): 
     self.d = {...} 

nie mogę całkiem-print self.d zawartość, mogę powrócić reprezentacji tylko jedna linia (przynajmniej bez gry z stacktraces, etc). - Przesłanianie PrettyPrinter nie jest opcją, nie chcę tego robić za każdym razem, gdy chcę wydrukować dokładnie tę samą klasę.

Więc ... Czy są jakieś alternatywy dla pprint, które pozwalają na tworzenie niestandardowych klas, które można wydrukować?

+0

Znaleziony https://pypi.python.org/pypi/pretty/0.1, ale wydaje się być tylko py2.X. – Equidamoid

+0

"Mogę zwrócić tylko jedną reprezentację" - dlaczego tak jest?NumPy na przykład zwraca wieloliniowe repr(), które działają dobrze. Oto przykład, jako ciąg w języku Python: '" array ([(0, 0, (0, 0, 0)), (0, 0, (0, 0, 0)), (0, 0, (0, 0, 0)), \ n (0, 0, (0, 0, 0))], \ n dtype = [('foo', 'u1'), ('bar', ' kampu

+0

@kampu Chodzi mi o to, że nie mogę zwrócić ciągu wielowierszowego, ponieważ złamie on wcięcie 'pprint'. – Equidamoid

Odpowiedz

1

dla ładnej drukowania może być szukasz __str__ zamiast (lub, jak również) __repr__

np

>>> import datetime 
>>> now = datetime.datetime.now() 
>>> print now 
2013-05-19 13:00:34.085383 
>>> print repr(now) 
datetime.datetime(2013, 5, 19, 13, 0, 34, 85383) 
+0

Teraz wyobraź sobie, że zamiast datetime masz klasę z kilkoma "dyktaturami" wystarczająco dużą, aby nie pasowały do ​​jednego wiersza terminala. A potem masz "dyktando" z kilkoma przedmiotami ... Tak jest w moim przypadku. – Equidamoid

3

Jeśli the pretty module spełnia Twoje potrzeby, można zrobić to praca z Pythona 3.

  1. Download i rozpakować plik pretty.py.
  2. Run 2to3 na nim:

    python -m lib2to3 -w pretty.py 
    
  3. Komentarz następujące linie:

    569: types.DictProxyType:  _dict_pprinter_factory('<dictproxy {', '}>'), 
    580: xrange:      _repr_pprint, 
    
  4. Umieść plik blisko skryptu.

  5. importu go jak zwykle:

    import pretty 
    
+0

Spróbuję jutro – Equidamoid

+0

@Equidamoid: czy ci się udało? – utapyngo

+0

Działa świetnie! Dziękuję Ci! – Equidamoid

0

Można utworzyć rodzajowe rozwiązanie, które drukuje zawartość pól obiektowych przez instacji PrettyPrinter. obj.__dict__ podaje słownik wszystkich pól obj.

Albo możesz po prostu użyć obj.__class__.__name__ + pformat(obj.__dict__).