1515 Stimmen

Gibt es eine eingebaute Funktion, die alle aktuellen Eigenschaften und Werte eines Objekts ausgibt?

Was ich hier also suche, ist so etwas wie PHPs drucken_r Funktion.

So kann ich meine Skripte debuggen, indem ich den Zustand des betreffenden Objekts sehe.

5voto

Michael Thamm Punkte 111

Warum nicht etwas Einfaches:

for key,value in obj.__dict__.iteritems():
    print key,value

5voto

Carl Cheung Punkte 333

Dies funktioniert unabhängig davon, wie Ihre Variablen innerhalb einer Klasse definiert sind, innerhalb von __init__ oder außerhalb.

your_obj = YourObj()
attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}

5voto

Nagev Punkte 6680

Ich habe die Antwort, in der nur pprint erwähnt wird, hochgestuft. Um das klarzustellen: Wenn Sie alle Werte in einer komplexen Datenstruktur, dann tun Sie etwas wie:

from pprint import pprint
pprint(my_var)

Wo meine_Var ist die Variable, die Sie interessiert. Wenn ich pprint(vars(my_var)) Ich habe nichts gefunden, und andere Antworten hier haben nicht geholfen oder die Methode sah unnötig lang aus. In meinem speziellen Fall hatte der Code, den ich untersuchte, übrigens ein Wörterbuch von Wörterbüchern.

Es lohnt sich, darauf hinzuweisen, dass Sie bei einigen benutzerdefinierten Klassen einfach mit einer wenig hilfreichen <someobject.ExampleClass object at 0x7f739267f400> Art der Ausgabe. In diesem Fall müssen Sie möglicherweise eine __str__ Methode, oder versuchen Sie eine der anderen Lösungen.

Ich habe auch festgestellt, dass in einem Fall, in dem ich diese Meldung erhielt object Art der Ausgabe, vars() zeigte mir, was ich wollte. Eine bessere Lösung, um beide Fälle abzudecken, wäre also, beides einzeln zu versuchen. Aber mit vars() kann zum Beispiel manchmal eine Ausnahme auslösen, TypeError: vars() argument must have __dict__ attribute .

Ich würde immer noch gerne etwas Einfaches finden, das in allen Szenarien funktioniert, ohne Bibliotheken von Drittanbietern.

4voto

Clark Punkte 164

Um "myObject" loszuwerden:

from bson import json_util
import json

print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))

Ich habe vars() und dir() ausprobiert; beide schlugen für das, was ich suchte, fehl. vars() funktionierte nicht, weil das Objekt kein __dict__ hatte (exceptions.TypeError: vars()-Argument muss __dict__-Attribut haben). dir() war nicht das, was ich suchte: es ist nur eine Auflistung von Feldnamen, gibt nicht die Werte oder die Objektstruktur.

Ich denke, json.dumps() würde für die meisten Objekte ohne default=json_util.default funktionieren, aber ich hatte ein Datetime-Feld im Objekt, so dass der Standard-Json-Serializer fehlschlug. Siehe Wie zu überwinden "datetime.datetime nicht JSON serializable" in Python?

4voto

DaOneTwo Punkte 53

Ich musste DEBUG-Informationen in einigen Protokollen ausdrucken und konnte pprint nicht verwenden, weil es die Funktion unterbrechen würde. Stattdessen habe ich dies getan und praktisch das Gleiche erhalten.

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X