Was ich hier suche, ist so etwas wie die print_r- Funktion von PHP .
Auf diese Weise kann ich meine Skripte debuggen, indem ich den Status des betreffenden Objekts sehe.
Was ich hier suche, ist so etwas wie die print_r- Funktion von PHP .
Auf diese Weise kann ich meine Skripte debuggen, indem ich den Status des betreffenden Objekts sehe.
Sie mischen wirklich zwei verschiedene Dinge zusammen.
Verwendung dir()
, vars()
oder das inspect
Modul zu bekommen , was Sie interessiert sind (ich verwende __builtins__
als Beispiel, Sie ein beliebiges Objekt verwenden können , statt).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Drucken Sie das Wörterbuch nach Belieben aus:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
oder
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
Hübsches Drucken ist auch im interaktiven Debugger als Befehl verfügbar:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
Mitglied zu haben (re.MatchObject
z. B. ein), aber die integrierte Funktiondir()
funktioniert für alle Objekte.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
in deiner Antwort nicht mehr über das Modul? Ich denke, es ist am nächsten an print_r oder var_dump.dir()
?dir()
Gibt nur eine Liste von Namen zurück, und nicht alle sind imvars()
oder im__dict__
Attribut vorhanden.Sie möchten
vars()
gemischt mitpprint()
:quelle
vars()
Gibt einfach das__dict__
Argument zurück und das ist auch der Fallback für dendir()
Fall, dass es keine__dir__
Methode gibt. alsodir()
erstmal verwenden, wie gesagt.dir()
gibt dir alle eingebauten Dinge, die dir wahrscheinlich egal sind, wie__str__
und__new__
.var()
nicht.__dict__
Attribut haben.Es gibt viele Funktionen von Drittanbietern, die Dinge wie Ausnahmebehandlung, Drucken von nationalen / Sonderzeichen, Rekursion in verschachtelte Objekte usw. gemäß den Präferenzen ihrer Autoren hinzufügen. Aber sie alle laufen im Grunde darauf hinaus.
quelle
getmembers()
Funktion im Standardmodul verwendeninspect
, aber ich dachte, dies wäre nützlicher, da es zeigt, wie Introspektion im Allgemeinen durchgeführt wird.__dict__
(wie__doc__
und__module__
) nicht gefunden werden . Funktioniert außerdem__dict__
überhaupt nicht für Objekte, mit denen deklariert wurde__slots__
.__dict__
Zeigt im Allgemeinen Eigenschaften auf Benutzerebene an, die tatsächlich intern in einem Wörterbuch gespeichert sind. dir () zeigt mehr.__dict__
Attribut / Mitglied. Ich weiß, dass es verrückt ist, aber wahr. Eingebaute wieint
undstr
oderre.MatchObject
sind gängige Beispiele. Versuchen Sie'hello'.__dict__
, dann versuchen Siedir('hello')
dir wurde erwähnt, aber das gibt dir nur die Namen der Attribute. Wenn Sie auch deren Werte möchten, versuchen Sie __dict__.
Hier ist die Ausgabe:
quelle
set
haben nicht__dict__
, so für sie wird es mitAttributeError: 'set' object has no attribute '__dict__'
Sie können dazu die Funktion "dir ()" verwenden.
Eine weitere nützliche Funktion ist die Hilfe.
quelle
So drucken Sie den aktuellen Status des Objekts:
oder
oder
Für Ihre Klassen definieren
__str__
oder__repr__
Methoden. Aus der Python-Dokumentation :quelle
print "DEBUG: object value: " + repr(obj)
Könnte einen Besuch wert sein -
Gibt es ein Python-Äquivalent zu Perls Data :: Dumper?
Meine Empfehlung lautet:
https://gist.github.com/1071857
Beachten Sie, dass Perl über ein Modul namens Data :: Dumper verfügt, das Objektdaten zurück in den Perl-Quellcode übersetzt (Hinweis: Code wird NICHT zurück in den Quellcode übersetzt, und fast immer möchten Sie die Funktionen der Objektmethode in der Ausgabe nicht verwenden). Dies kann für die Persistenz verwendet werden, aber der allgemeine Zweck ist das Debuggen.
Es gibt eine Reihe von Dingen, die mit Standard-Python-Drucken nicht erreicht werden können. Insbesondere hört es einfach auf abzusteigen, wenn es eine Instanz eines Objekts sieht, und gibt Ihnen den internen Hex-Zeiger des Objekts (ähm, dieser Zeiger wird von nicht viel verwendet der Weg). Kurz gesagt, bei Python dreht sich alles um dieses großartige objektorientierte Paradigma, aber die Tools, die Sie sofort erhalten, sind für die Arbeit mit etwas anderem als Objekten konzipiert.
Mit dem Perl Data :: Dumper können Sie steuern, wie tief Sie gehen möchten, und auch kreisförmig verknüpfte Strukturen erkennen (das ist wirklich wichtig). Dieser Prozess ist in Perl grundsätzlich einfacher zu erreichen, da Objekte über ihren Segen hinaus keine besondere Magie haben (ein allgemein gut definierter Prozess).
quelle
Ich empfehle die Verwendung
help(your_object)
.help(dir)
help(vars)
quelle
In den meisten Fällen erhalten Sie mit
__dict__
oderdir()
erhalten Sie die gewünschten Informationen. Sollten Sie weitere Details benötigen, enthält die Standardbibliothek das Inspect- Modul, mit dem Sie beeindruckende Details erhalten. Einige der wirklich wichtigsten Informationen sind:Wenn Sie gerade auf der Suche nach „welchen Attributwert hat mein Objekt?“, Dann
dir()
und__dict__
ist wahrscheinlich ausreichend. Wenn Sie wirklich in den aktuellen Zustand beliebiger Objekte eintauchen möchten (denken Sie daran, dass in Python fast alles ein Objekt ist), danninspect
ist dies eine Überlegung wert.quelle
Nein. Die am besten bewertete Antwort schließt einige Arten von Attributen aus, und die akzeptierte Antwort zeigt, wie alle Attribute abgerufen werden, einschließlich Methoden und Teile der nicht öffentlichen API. Dafür gibt es aber keine gute vollständige eingebaute Funktion.
Die kurze Konsequenz ist also, dass Sie Ihre eigenen schreiben können, aber es werden Eigenschaften und andere berechnete Datenbeschreibungen berechnet, die Teil der öffentlichen API sind, und das möchten Sie möglicherweise nicht:
Probleme mit anderen Antworten
Beachten Sie die Anwendung der aktuell am besten bewerteten Antwort auf eine Klasse mit vielen verschiedenen Arten von Datenelementen:
druckt nur:
Da
vars
nur das__dict__
Objekt zurückgegeben wird und es sich nicht um eine Kopie handelt. Wenn Sie also das von vars zurückgegebene Diktat ändern, ändern Sie auch__dict__
das Objekt selbst.kehrt zurück:
- was schlecht ist, weil quux eine Eigenschaft ist, die wir nicht festlegen sollten und die nicht im Namespace sein sollte ...
Das Anwenden der Ratschläge in der aktuell akzeptierten Antwort (und anderen) ist nicht viel besser:
Wie wir sehen können, werden
dir
nur alle (eigentlich nur die meisten) Namen zurückgegeben, die einem Objekt zugeordnet sind.inspect.getmembers
, in den Kommentaren erwähnt, ist ähnlich fehlerhaft - es gibt alle Namen und Werte zurück.Aus der Klasse
Während des Unterrichts lassen meine Schüler eine Funktion erstellen, die die semantisch öffentliche API eines Objekts bereitstellt:
Wir können dies erweitern, um eine Kopie des semantischen Namespace eines Objekts bereitzustellen , aber wir müssen ausschließen
__slots__
, die nicht zugewiesen sind, und wenn wir die Anforderung nach "aktuellen Eigenschaften" ernst nehmen, müssen wir berechnete Eigenschaften ausschließen (as Sie könnten teuer werden und als nicht "aktuell" interpretiert werden.Und jetzt berechnen oder zeigen wir die Eigenschaft nicht, quux:
Vorsichtsmaßnahmen
Aber vielleicht wissen wir, dass unsere Immobilien nicht teuer sind. Möglicherweise möchten wir die Logik ändern, um sie auch einzuschließen. Und vielleicht möchten wir stattdessen andere benutzerdefinierte Datenbeschreibungen ausschließen .
Dann müssen wir diese Funktion weiter anpassen. Daher ist es sinnvoll, dass wir keine integrierte Funktion haben können, die auf magische Weise genau weiß, was wir wollen, und diese bereitstellt. Dies ist eine Funktionalität, die wir selbst erstellen müssen.
Fazit
Es gibt keine eingebaute Funktion, die dies tut, und Sie sollten das tun, was für Ihre Situation semantisch am besten geeignet ist.
quelle
FunctionType
. Aber sehr hilfreich - danke!Ein Metaprogrammierungsbeispiel Objekt mit Magie entsorgen :
Ohne Argumente:
Mit Gnosis Utils :
Es ist etwas veraltet, funktioniert aber immer noch.
quelle
Wenn Sie dies zum Debuggen verwenden und nur einen rekursiven Speicherauszug von allem wünschen, ist die akzeptierte Antwort unbefriedigend, da Ihre Klassen bereits über gute
__str__
Implementierungen verfügen müssen . Wenn dies nicht der Fall ist, funktioniert dies viel besser:quelle
TypeError: vars() argument must have __dict__ attribute
Versuchen Sie es mit ppretty
Ausgabe:
quelle
quelle
Dadurch werden alle Objektinhalte rekursiv im json- oder yaml-eingerückten Format ausgedruckt:
quelle
Ich habe die Antwort, die nur Drucke erwähnt, positiv bewertet. Wenn Sie alle Werte in einer komplexen Datenstruktur anzeigen möchten , gehen Sie wie folgt vor:
Wobei my_var Ihre interessierende Variable ist. Als ich benutzte,
pprint(vars(my_var))
bekam ich nichts und andere Antworten hier halfen nicht oder die Methode sah unnötig lang aus. Übrigens hatte der Code, den ich inspizierte, in meinem speziellen Fall ein Wörterbuch mit Wörterbüchern.Es ist erwähnenswert, dass bei einigen benutzerdefinierten Klassen möglicherweise nur eine nicht hilfreiche
<someobject.ExampleClass object at 0x7f739267f400>
Ausgabe erfolgt. In diesem Fall müssen Sie möglicherweise eine__str__
Methode implementieren oder einige der anderen Lösungen ausprobieren. Ich möchte immer noch etwas Einfaches finden, das in allen Szenarien funktioniert, ohne Bibliotheken von Drittanbietern.quelle
Ich musste DEBUG-Informationen in einigen Protokollen drucken und konnte pprint nicht verwenden, da dies zu einer Unterbrechung führen würde. Stattdessen habe ich das gemacht und praktisch das Gleiche bekommen.
quelle
So löschen Sie "myObject":
Ich habe vars () und dir () ausprobiert. beide scheiterten an dem, wonach ich suchte. vars () hat nicht funktioniert, weil das Objekt kein __dict__ hatte (Ausnahmen.TypeError: Das Argument vars () muss das Attribut __dict__ haben). dir () war nicht das, wonach ich gesucht habe: Es ist nur eine Auflistung von Feldnamen, gibt weder die Werte noch die Objektstruktur an.
Ich denke, json.dumps () würde für die meisten Objekte ohne den Standard = json_util.default funktionieren, aber ich hatte ein Datum / Uhrzeit-Feld im Objekt, so dass der Standard-JSON-Serializer fehlschlug. Siehe Wie man "datetime.datetime nicht JSON serialisierbar" in Python überwindet?
quelle
Warum nicht etwas Einfaches:
quelle
for key,value in obj.__dict__.iteritems(): print key,value
?pprint enthält einen „hübschen Drucker“ zur Erstellung ästhetisch ansprechender Darstellungen Ihrer Datenstrukturen. Der Formatierer erzeugt Darstellungen von Datenstrukturen, die vom Interpreter korrekt analysiert werden können und für einen Menschen auch leicht zu lesen sind. Die Ausgabe wird nach Möglichkeit in einer einzelnen Zeile gehalten und bei Aufteilung auf mehrere Zeilen eingerückt.
quelle
Probieren Sie einfach Beeprint .
Es hilft Ihnen nicht nur beim Drucken von Objektvariablen, sondern auch bei der schönen Ausgabe wie folgt:
quelle
Für alle, die damit zu kämpfen haben
vars()
nicht alle Attribute zurückgeben.dir()
Die Werte der Attribute werden nicht zurückgegeben.Der folgende Code druckt alle Attribute
obj
mit ihren Werten:quelle
Sie können die Flask Debug-Symbolleiste ausprobieren.
https://pypi.python.org/pypi/Flask-DebugToolbar
quelle
Ich arbeite gerne mit in Python-Objekten integrierten Schlüsseln oder Werten .
Für Attribute, unabhängig davon, ob es sich um Methoden oder Variablen handelt:
Für Werte dieser Attribute:
quelle
Dies funktioniert unabhängig davon, wie Ihre Variablen innerhalb einer Klasse innerhalb oder außerhalb von __init__ definiert sind.
quelle