2017-06-29 20 views
0

Ich habe ein Wörterbuch und eine print-Anweisung wie folgt:Python: Wie überschreiben, was drucken (dict) ausgibt?

d = {'ar':4, 'ma':4, 'family':pf.Normal()} 
print(d) 

Was mich gibt

{'ar': 4, 'ma': 4, 'family': <pyflux.families.normal.Normal object at 0x11b6bc198>} 

Gibt es eine Möglichkeit, den Wert der ‚Familie‘ Schlüssel zu bereinigen? Es ist wichtig, dass die Anrufe einfach "print (d)" bleiben, weil sie bisher ohne dieses Problem andere Wörterbücher gedruckt hat. Ist das möglich? Vielen Dank für Ihre Zeit.

EDIT:

Danke für die Antwort Jungs, ich würde man als richtig markieren, aber ich habe sie nicht versucht, und nicht bestätigen kann. Am Ende habe ich ein anderes Wörterbuch mit der aufgeräumten Zeichenfolge als Schlüssel und dem Objekt als Wert erstellt. Es war ein bisschen mehr Arbeit, aber ich habe es getan, bevor ich die Antworten gelesen habe, also blieb ich einfach dabei. Danke trotzdem!

+8

Sie wollen nicht chage was 'print (dict)' Ausgänge Sie eine '__repr __()' Funktion 'pf.Normal()' hinzufügen möchten ändern, wie _it_ wird angezeigt. Ich bin mir nicht sicher was genau 'pformal()' ist, aber erben vielleicht davon und fügen ein benutzerdefiniertes '__repr __()' hinzu? –

Antwort

2

wie ich denke pyflux ist eine externe Bibliothek, ich denke, Sie sollten es nicht direkt bearbeiten. Eine einfache Möglichkeit zu tun, was Sie wollen, ist die __str__ oder __repr__ Methoden der Normal Klasse zu überschreiben.

Hier habe ich eine Lambda-Funktion zur Veranschaulichung verwendet, aber natürlich können Sie eine definierte Funktion verwenden.

+1

Monkey Patching spezielle Methoden möglicherweise nicht funktionieren - siehe https://stackoverflow.com/questions/10376604/overriding-special-methods-on-an-instance –

+0

@PeterGibson das ist in Ordnung, weil es Affe-Patched * auf der Klasse * . –

+0

@ juanpa.arrivillaga Ja, du hast Recht. Sollte es leid tun. –

4

Sie sind falsch. Sie möchten nicht die print(dict) Ausgänge ändern. Das würde eine Änderung der Art und Weise erfordern, wie eingebaute Wörterbücher gedruckt werden. Sie möchten eine benutzerdefinierte __repr__() zu Ihrem pf.Normal() Objekt hinzufügen.

I believe pf.Normal() comes from the pyflux package, schlage ich vor, so zu sehen, welche Daten die Klasse zu halten, annehmen, und ziemlich Druck durch aus der Klasse erben:

class CustomNormalObject(pf.Normal): 
    def __repr__(self): 
     # Add pretty printed data here 
     pass 

Oder wenn Sie benötigen, um Ihre eigenen Argumente in der benutzerdefinierten Klasse zu übergeben, Sie können super() verwenden:

class CustomNormalObject(pf.Normal): 
    def __init__(self, myparm, *args, **kwargs): 
     # If using Python 3, you can call super without 
     # passing in any arguments. This is simply for Python 2 
     # compatibility. 
     super(CustomNormalObject, self).__init__(*args, **kwargs) 
     self.myparm = myparm 

    def __repr__(self): 
     # Add pretty printed data here 
     pass