2013-05-19 8 views
9

Standard pprint Modul ist schön, wenn es um Listen, dicts und so weiter geht. Aber manchmal völlig unbrauchbar mit benutzerdefinierten Klassen:Python 3.x: alternative pprint-Implementierung

  • Der einzige Weg, es nutzbare Informationen über ein Objekt einer Klasse drucken zu machen, ist __repr__ außer Kraft zu setzen, aber was, wenn meine Klasse schon schön hat, eval() ‚in der Lage __repr__ das ist die Informationen nicht zeigen, die ich in print output sehen möchte?

  • Ok, werde ich Druck orientierte __repr__ schreiben, aber in diesem Fall ist es unmöglich, Pretty-Print etwas in meiner Klasse:

.

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

Ich kann nicht recht-print self.d Inhalt, kann ich nur einzeilige Darstellung zurückkehren (zumindest ohne mit stacktraces zu spielen, etc). - Überschreiben PrettyPrinter ist keine Option, ich möchte es nicht jedes Mal tun, wenn ich die gleiche Klasse hübsch drucken möchte.

Also ... Gibt es Alternativen zu pprint, die es ermöglichen, eine benutzerdefinierte Klasse hübsch druckbar zu machen?

+0

https://pypi.python.org/pypi/pretty/0.1 gefunden, aber es scheint nur py2.X zu sein – Equidamoid

+0

"Ich kann nur eine einzeilige Darstellung zurückgeben" - warum ist das?NumPy gibt zum Beispiel mehrzeilige repr() s zurück, die gut funktionieren. Hier ein Beispiel als Python-String: '" 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 Ich meine, ich kann mehrzeilige Zeichenfolge nicht zurückgeben, weil es "pprint" Einzug bricht. – Equidamoid

Antwort

1

für ziemlich Drucken Sie __str__ suchen können anstelle von (oder auch) __repr__

z.B.

>>> 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

Stellen Sie sich nun vor, dass Sie anstelle von datetime eine Klasse mit mehreren 'dict's haben, die groß genug sind, damit sie nicht in eine Terminalzeile passen. Und dann hast du ein "Diktat" mit mehreren dieser Objekte ... Das ist mein Fall. – Equidamoid

3

Wenn the pretty module befriedigt Ihre Bedürfnisse, können Sie es mit Python 3. funktioniert

  1. Download und entpacken Sie die Datei pretty.py.
  2. Run 2to3 darauf:

    python -m lib2to3 -w pretty.py 
    
  3. Kommentieren Sie die folgenden Zeilen:

    569: types.DictProxyType:  _dict_pprinter_factory('<dictproxy {', '}>'), 
    580: xrange:      _repr_pprint, 
    
  4. die Datei in der Nähe von Ihrem Skript Put.

  5. Import es wie gewohnt:

    import pretty 
    
+0

Ich werde es morgen versuchen – Equidamoid

+0

@Equidamoid: haben Sie Erfolg? – utapyngo

+0

Funktioniert gut! Vielen Dank! – Equidamoid

0

können Sie eine generische Lösung erstellen, die den Inhalt der Objektfelder druckt von Pretty Subklassen. obj.__dict__ erhalten Sie ein Wörterbuch aller Felder von obj.

Oder Sie können einfach obj.__class__.__name__ + pformat(obj.__dict__) verwenden.