Gibt es eine eingebaute Funktion die aktuellen Eigenschaften und Werte alle ein Objekt zu drucken?
-
08-07-2019 - |
Frage
Also, was denn hier ist ich suche so etwas wie PHP print_r Funktion. Dies ist, so kann ich meine Skripte debuggen, indem Sie sehen, was ist der Zustand des Objekts in Frage.
Lösung
Andere Tipps
Sie vars()
wollen mit pprint()
gemischt:
from pprint import pprint
pprint(vars(your_object))
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))
Es gibt viele 3rd-Party-Funktionen gibt, die Dinge wie die Ausnahmebehandlung, national / Sonderzeichendruck hinzufügen, Rekursion in verschachtelte Objekte usw. nach ihren Autoren Präferenzen. Aber sie alle im Grunde dazu einkochen.
dir erwähnt wurde, aber das wird Ihnen nur die Attribute geben Namen. Wenn Sie wollen, dass ihre Werte versuchen auch __dict __.
class O:
def __init__ (self):
self.value = 3
o = O()
Hier ist die Ausgabe:
>>> o.__dict__
{'value': 3}
Um den aktuellen Zustand des Objekts drucken Sie könnte:
>>> obj # in an interpreter
oder
print repr(obj) # in a script
oder
print obj
Für Ihre Klassen definieren __str__
oder __repr__
Methoden. Aus Python-Dokumentation :
__repr__(self)
durch die eingebaute inrepr()
Aufgerufene Funktion und durch Zeichenfolge Conversions (Reverse Anführungszeichen) zu berechnen die „offizielle“ string Darstellung eines Objekts. Wenn überhaupt möglich, sollte dies wie eine aussehen gültige Python-Ausdruck, könnte verwendet, um ein Objekt zu erstellen mit der denselben Wert (bei entsprechender Umgebung). Wenn dies nicht möglich ist, ein String der Form „<... einige nützliche Beschreibung ...>“zurückgegeben werden soll. Der Rückgabewert muss ein String sein Objekt. Wenn eine Klasse definiert repr () aber nicht__str__()
, dann__repr__()
ist auch verwendet, wenn ein „informelles“ string Darstellung von Instanzen, dass Klasse erforderlich ist. Dies ist in der Regel für das Debuggen verwendet, so ist es wichtig, daß die Darstellung ist informationsreiche und eindeutig sind.
__str__(self)
durch die eingebaute instr()
Aufgerufene Funktion und durch den Druck Erklärung zur Berechnung der „informellen“ String-Darstellung eines Objekts. Dies unterscheidet sich von__repr__()
, dass es muss kein gültiger Python sein Ausdruck: ein bequemer oder prägnante Darstellung verwendet werden kann, stattdessen. Der Rückgabewert muss sein, String-Objekt.
Sie können den "dir ()" Funktion verwenden, um dies zu tun.
>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>
Ein weiteres nützliches Feature ist die Hilfe.
>>> help(sys)
Help on built-in module sys:
NAME
sys
FILE
(built-in)
MODULE DOCS
http://www.python.org/doc/current/lib/module-sys.html
DESCRIPTION
This module provides access to some objects used or maintained by the
interpreter and to functions that interact strongly with the interpreter.
Dynamic objects:
argv -- command line arguments; argv[0] is the script pathname if known
Könnte sein lohnt sich -
Gibt es eine Python entspricht dem Perl-Data :: Dumper / a>
Meine Empfehlung ist, diese -
https://gist.github.com/1071857
Beachten Sie, dass Perl ein Modul namens Data :: Dumper, die zurück Objektdaten übersetzt Quellcode Perl (NB: es nicht übersetzen Code zurück zur Quelle, und fast immer Sie wollen nicht auf die Objektmethode Funktionen in der Ausgabe). Dies kann für die Persistenz verwendet werden, aber der gemeinsame Zweck ist für das Debuggen.
Es gibt eine Reihe von Dingen Standard-Python-pprint, es absteigend nur insbesondere zu erreichen, nicht stoppt, wenn es eine Instanz eines Objekt sieht und gibt Ihnen den Innensechskant-Zeiger des Objekts (errr, dass Zeiger ist nicht eine ganze Menge die Verwendung durch die Art und Weise). Also kurz gesagt ist, Python alles über dieses große objektorientierte Paradigma, aber die Werkzeuge, die Sie aus dem Kasten heraus zu bekommen sind für die Arbeit mit etwas anderes als Objekte.
Das Perl Data :: Dumper können Sie steuern, wie tief Sie gehen wollen, und erkennt auch zirkulargelinkte Strukturen (das ist wirklich wichtig). Dieser Prozess ist im Grunde einfacher in Perl zu erreichen, weil Objekte keine besondere Magie über ihren Segen haben (einen universell gut definierte Prozess).
In den meisten Fällen mit __dict__
oder dir()
erhalten Sie die Informationen Sie wollen. Sollten Sie weitere Informationen passieren müssen, die Standard-Bibliothek der Modul rel="noreferrer"> zu inspizieren, die Ihnen erlaubt, einige beeindruckende Menge an Details zu erhalten. Einige der realen nuggests von Informationen enthalten:
- Namen der Funktion und Methodenparameter
- Klassenhierarchien
- Quellcode der Implementierung einer Funktion / Klassenobjekte
- lokale Variablen aus einem Frame-Objekt
Wenn Sie gerade suchen „welche Werte Attribut hat mein Objekt?“, Dann dir()
und __dict__
sind wahrscheinlich ausreichend. Wenn Sie wirklich einen Blick in den aktuellen Stand der beliebigen Objekte zu graben (in Anbetracht, dass in Python fast alles ist ein Objekt), dann inspect
ist erwägenswert.
Ein metaprogramming Beispiel Dump-Objekt mit Magie :
$ cat dump.py
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
module, metaklass = sys.argv[1:3]
m = __import__(module, globals(), locals(), [metaklass])
__metaclass__ = getattr(m, metaklass)
class Data:
def __init__(self):
self.num = 38
self.lst = ['a','b','c']
self.str = 'spam'
dumps = lambda self: repr(self)
__str__ = lambda self: self.dumps()
data = Data()
print data
Ohne Argument:
$ python dump.py
<__main__.Data instance at 0x00A052D8>
Mit Gnosis Utils :
$ python dump.py gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
<item type="string" value="a" />
<item type="string" value="b" />
<item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>
Es ist ein bisschen veraltet, aber immer noch arbeiten.
Wenn Sie verwenden diese für das Debuggen, und Sie wollen einfach nur eine rekursive Dump alles, die akzeptierte Antwort ist unbefriedigend, weil es erfordert, dass Ihre Klassen bereits gute __str__
Implementierungen haben. Wenn das nicht der Fall ist, das funktioniert viel besser:
import json
print(json.dumps(YOUR_OBJECT,
default=lambda obj: vars(obj),
indent=1))
Dies gibt alle Objekt Inhalt rekursiv in json oder yaml gegliedertem Format:
import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml
serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
Ich empfehle help(your_object)
verwendet wird.
help(dir)
If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it. If the object supplies a method named __dir__, it will be used; otherwise the default dir() logic is used and returns: for a module object: the module's attributes. for a class object: its attributes, and recursively the attributes of its bases. for any other object: its attributes, its class's attributes, and recursively the attributes of its class's base classes.
help(vars)
Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.
Ich war um Debug-Informationen in einigen Protokollen zu drucken und war nicht in der Lage pprint zu verwenden, weil sie es brechen. Stattdessen tat ich dies und bekam fast das gleiche.
DO = DemoObject()
itemDir = DO.__dict__
for i in itemDir:
print '{0} : {1}'.format(i, itemDir[i])
Dump "myObject":
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
Ich habe versucht, Vars () und dir (); beide gescheitert, was ich suchte. Vars () funktionierte nicht, weil das Objekt nicht __dict__ hatte (exceptions.TypeError: vars () Argument muss __dict__ Attribut). dir () war nicht das, was ich suchte. es ist nur eine Liste von Feldnamen, nicht die Werte geben oder die Objektstruktur
Ich denke, json.dumps () für die meisten Objekte ohne default = json_util.default funktionieren würde, aber ich hatte in dem Objekt ein Datetime-Feld, so dass der Standard-json Serializer fehlgeschlagen. Siehe Wie zu überwinden „datetime.datetime nicht JSON serializable“ in python?
from pprint import pprint
def print_r(the_object):
print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
pprint(vars(the_object))
Versuchen Sie ppretty
from ppretty import ppretty
class A(object):
s = 5
def __init__(self):
self._p = 8
@property
def foo(self):
return range(10)
print ppretty(A(), show_protected=True, show_static=True, show_properties=True)
Ausgabe:
__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
pprint enthält einen „ziemlich Drucker“ für die Herstellung von ästhetisch ansprechenden Darstellungen Ihre Datenstrukturen. Der Formatierer erzeugt Darstellungen von Datenstrukturen, die korrekt vom Interpreter analysiert werden können, und sind auch leicht für einen Menschen zu lesen. Die Ausgabe wird in einer einzigen Zeile gehalten, wenn möglich, und eingekerbte, wenn sie über mehrere Zeilen aufgeteilt.
Warum nicht etwas einfach:
for key,value in obj.__dict__.iteritems():
print key,value
Ich habe die Antwort upvoted, die nur pprint erwähnt. Um klar zu sein, wenn Sie alle Werte sehen wollen in einer komplexen Datenstruktur, dann so etwas wie:
from pprint import pprint
pprint(my_var)
Wo my_var ist Ihre Variable von Interesse. Als ich noch pprint (VARs (my_var)) Ich habe nichts, und andere Antworten hier haben sah nicht helfen, oder das Verfahren unnötig lang. By the way, in meinem Fall, ich den Code ein Wörterbuch der Wörterbücher hatte inspizierte.
erwähnenswert, dass mit einigen benutzerdefinierten Klassen können Sie nur mit einer nicht hilfreich <someobject.ExampleClass object at 0x7f739267f400>
Art der Ausgabe am Ende. In diesem Fall könnten Sie eine __str__
Methode implementieren müssen, oder einige der anderen Lösungen versuchen. Ich würde immer noch gerne etwas einfach zu finden, die ohne Drittanbieter-Bibliotheken in allen Szenarien funktioniert.
Versuchen Sie einfach beeprint .
Es wird Ihnen helfen, nicht nur für die Druckobjektvariablen, aber schön Ausgang als auch, wie folgt aus:
class(NormalClassNewStyle):
dicts: {
},
lists: [],
static_props: 1,
tupl: (1, 2)
Für alle kämpfen mit
-
vars()
Rückkehr nicht alle Attribute. -
dir()
nicht die Attribute Werte zurück.
Die folgende Code druckt alle Attribute von obj
mit ihren Werten:
for attr in dir(obj):
try:
print("obj.{} = {}".format(attr, getattr(obj, attr)))
except AttributeError:
print("obj.{} = ?".format(attr))
Sie können die Flasche Debug Toolbar versuchen.
https://pypi.python.org/pypi/Flask-DebugToolbar
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
# the toolbar is only enabled in debug mode:
app.debug = True
# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)