web-dev-qa-db-de.com

Gibt es eine integrierte Funktion zum Drucken aller aktuellen Eigenschaften und Werte eines Objekts?

Was ich also hier suche, ist so etwas wie die Funktion PHP print_r . Auf diese Weise kann ich meine Skripts debuggen, indem ich den Status des fraglichen Objekts sehe.

754
fuentesjr

Sie mischen wirklich zwei verschiedene Dinge zusammen.

Verwenden Sie dir() , vars() oder das inspect - Modul, um das zu erhalten, was Sie interessiert (ich verwende __builtins__ als Beispiel; Sie können stattdessen jedes Objekt verwenden).

>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__

Drucken Sie das Wörterbuch so aus, wie es Ihnen gefällt:

>>> 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',
...

Im interaktiven Debugger ist auch das Drucken 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__'}
472
user3850

Sie möchten vars() gemischt mit pprint():

from pprint import pprint
pprint(vars(your_object))
819
Jeremy Cantrell
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

Es gibt viele Funktionen von Drittanbietern, die beispielsweise Ausnahmenbehandlung, Drucken von nationalen/Sonderzeichen, Rekursion in verschachtelten Objekten usw. gemäß den Präferenzen der Autoren hinzufügen. Aber im Grunde laufen alle darauf hinaus.

160
Dan Lenski

dir wurde erwähnt, aber das gibt Ihnen nur die Namen der Attribute. Wenn Sie auch deren Werte wünschen, versuchen Sie __dict__.

class O:
   def __init__ (self):
      self.value = 3

o = O()

Hier ist die Ausgabe:

>>> o.__dict__

{'value': 3}
45
eduffy

Um den aktuellen Status des Objekts zu drucken, können Sie Folgendes tun: 

>>> obj # in an interpreter

oder 

print repr(obj) # in a script

oder

print obj

Definieren Sie für Ihre Klassen __str__- oder __repr__-Methoden. Aus der Python-Dokumentation :

__repr__(self) Wird von der integrierten Funktion repr() und von der Zeichenfolge .__ aufgerufen. Konvertierungen (umgekehrte Anführungszeichen) in Berechne die "offizielle" Zeichenfolge Darstellung eines Objekts. Wenn überhaupt Möglicherweise sollte dies wie eine .__ aussehen. gültiger Python-Ausdruck, der .__ sein könnte. wird verwendet, um ein Objekt mit der .__ neu zu erstellen. gleicher Wert (bei entsprechender Umgebung). Wenn dies nicht möglich ist, Eine Zeichenfolge der Form "<... einige nützliche Beschreibung ...>" sollte zurückgegeben werden . Der Rückgabewert muss eine Zeichenfolge sein Objekt. Wenn eine Klasse repr () .__ definiert. aber nicht __str__(), dann ist __repr__() Wird auch verwendet, wenn eine "informelle" Zeichenfolge Darstellung von Instanzen davon Klasse ist erforderlich. Dies ist normalerweise Wird für das Debuggen verwendet, daher ist es wichtig dass die Darstellung ist informationsreich und eindeutig.

__str__(self) Wird von der integrierten Funktion str() und vom Druck aufgerufen Anweisung zur Berechnung des "informellen" Stringdarstellung eines Objekts . Dies unterscheidet sich von __repr__() darin, dass es muss kein gültiger Python sein Ausdruck: ein bequemer oder eine kurze Darstellung kann verwendet werden stattdessen. Der Rückgabewert muss ein .__ sein. String-Objekt.

20
jfs

Sie können dazu die Funktion "dir ()" verwenden.

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

Eine weitere nützliche Funktion 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
19
Joe Skora

Könnte einen Besuch wert sein -

Gibt es ein Python-Äquivalent zu Perls Data :: Dumper?

Meine Empfehlung ist das -

https://Gist.github.com/1071857

Beachten Sie, dass Perl über ein Modul namens Data :: Dumper verfügt, das Objektdaten in den Perl-Quellcode zurückübersetzt (Achtung: Code wird NICHT in den Quellcode zurück übersetzt, und fast immer möchten Sie die Objektmethodenfunktionen in der Ausgabe nicht). Dies kann zur Persistenz verwendet werden, der übliche Zweck ist jedoch das Debuggen.

Es gibt eine Reihe von Dingen, die mit Standard-Python-Pprint nicht erreicht werden können. Insbesondere wird der Python-Pprint nicht mehr angezeigt, wenn er eine Instanz eines Objekts sieht und Ihnen den internen Hex-Zeiger des Objekts gibt (errr, dieser Zeiger ist nicht viel zu gebrauchen der Weg). Kurz gesagt, in Python dreht sich alles um dieses großartige objektorientierte Paradigma, aber die Werkzeuge, die Sie aus der Box bekommen, sind für die Arbeit mit etwas anderem als Objekten gedacht.

Mit dem Perl Data :: Dumper können Sie steuern, wie tief Sie gehen möchten, und auch kreisförmig verbundene Strukturen erkennen (das ist sehr wichtig). Dieser Prozess ist in Perl wesentlich einfacher zu erreichen, da Objekte keine besondere Magie haben, die über ihren Segen hinausgeht (ein allgemein definierter Prozess).

15
Tel

In den meisten Fällen erhalten Sie mit __dict__ oder dir() die gewünschten Informationen. Sollten Sie mehr Details benötigen, enthält die Standardbibliothek das Modul inspect , mit dem Sie beeindruckende Details erhalten. Zu den echten Nuggests von Informationen gehören:

  • namen der Funktions- und Methodenparameter
  • klassenhierarchien
  • quellcode der Implementierung von Funktionen/Klassenobjekten
  • lokale Variablen aus einem Rahmenobjekt

Wenn Sie nur nach "welchen Attributwerten für mein Objekt?" Suchen, sind dir() und __dict__ wahrscheinlich ausreichend. Wenn Sie sich wirklich mit dem aktuellen Status von beliebigen Objekten beschäftigen (wenn Sie sich vor Augen halten, dass in Python fast alles ein Objekt ist), ist inspect eine Überlegung wert.

11
William McVey

Ein Metaprogrammierungsbeispiel 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 Argumente:

 $ 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 etwas veraltet, funktioniert aber immer noch.

7
jfs

Ich empfehle die Verwendung von help(your_object).

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__.
6
prosti

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. Wenn das nicht der Fall ist, funktioniert das viel besser:

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))
5
Adam Cath

Dies druckt den gesamten Objektinhalt rekursiv in json oder yaml eingerückt aus:

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)
4
wisbucky

So sichern Sie "myObject":

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 () versucht; beide scheiterten bei dem, wonach ich suchte. vars () funktionierte nicht, da das Objekt nicht __dict__ (Ausnahmen.TypeError: Das Argument vars () muss das Attribut __dict__ haben). dir () war nicht das, wonach ich gesucht hatte: Es ist nur eine Auflistung von Feldnamen, gibt nicht die Werte oder die Objektstruktur an.

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, sodass der Standard-Json-Serializer fehlgeschlagen ist. Siehe Wie kann man "datetime.datetime nicht JSON serializable" in Python überwinden?

3
Clark

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)
3
Symon

Ich musste DEBUG-Informationen in einigen Protokollen drucken und konnte pprint nicht verwenden, da dadurch die Daten beschädigt wurden. Stattdessen tat ich das und bekam praktisch dasselbe.

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])
3
DaOneTwo
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))
3
32ndghost

Warum nicht etwas einfaches:

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

pprint enthält einen "hübschen Drucker" zur Erstellung ästhetisch ansprechender Darstellungen Ihrer Datenstrukturen. Der Formatierer erzeugt Repräsentationen von Datenstrukturen, die vom Interpreter korrekt analysiert werden können und die für einen Menschen leicht lesbar sind. Die Ausgabe wird, wenn möglich, in einer einzigen Zeile gehalten und bei der Aufteilung auf mehrere Zeilen eingerückt.

2
shahjapan

Probieren Sie einfach beeprint aus.

Es hilft Ihnen nicht nur beim Drucken von Objektvariablen, sondern auch bei der Ausgabe wie folgt:

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)
2
Anyany Pan

Ich habe die Antwort, die nur pprint erwähnt, bestätigt. Um klar zu sein, wenn Sie alle Werte in einer komplexen Datenstruktur sehen möchten, machen Sie etwas wie:

from pprint import pprint
pprint(my_var)

Wo my_var ist Ihre interessierende Variable. Als ich pprint (vars (my_var)) verwendet habe, habe ich nichts bekommen, und andere Antworten haben nicht geholfen, oder die Methode sah unnötig lang aus. In meinem speziellen Fall hatte der von mir untersuchte Code übrigens ein Wörterbuch mit Wörterbüchern.

Es sollte darauf hingewiesen werden, dass bei einigen benutzerdefinierten Klassen möglicherweise nur eine nicht hilfreiche <someobject.ExampleClass object at 0x7f739267f400>-Ausgabe ausgegeben wird. 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 ohne Bibliotheken von Drittanbietern funktioniert.

2
Nagev

Ich arbeite gerne mit in Python-Objekten integrierten Typen keys oder values ​​

Bei Attributen handelt es sich unabhängig davon um Methoden oder Variablen: 

o.keys()

Für Werte dieser Attribute:

o.values()
0
Evhz

Für alle, die mit kämpfen 

  • vars() gibt nicht alle Attribute zurück. 
  • dir() gibt die Werte der Attribute nicht zurück.

Der folgende Code druckt all - 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))
0
Robert Hönig

Sie können die Flask Debug Toolbar ausprobieren.
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)
0
Slipstream