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.

War es hilfreich?

Lösung

Sie sind Mischen wirklich zwei verschiedene Dinge.

Verwenden Sie dir() , vars() oder die

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 in repr() 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 in str() 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

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).

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)

Ich mag die Arbeit mit Python Objekt eingebauten Typen Tasten oder Werte .

Für Attribute unabhängig sie sind Methoden oder Variablen:

o.keys()

Für die Werte dieser Attribute:

o.values()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top