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.

37voto

Joe Skora Punkte 14359

Dazu können Sie 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

28voto

jfs Punkte 370717

Um den aktuellen Zustand des Objekts zu drucken, könnten Sie:

>>> obj # in an interpreter

ou

print repr(obj) # in a script

ou

print obj

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

__repr__(self) Aufgerufen von der repr() integrierte Funktion und durch die Zeichenfolge Konvertierungen (umgekehrte Anführungszeichen) zur die "offizielle" String-Darstellung Darstellung eines Objekts zu berechnen. Wenn irgend möglich möglich, sollte dies wie ein gültiger Python-Ausdruck aussehen, den man verwendet werden kann, um ein Objekt mit dem gleichen Wert zu erzeugen (bei entsprechender Umgebung). Falls dies nicht möglich ist, eine Zeichenkette in der Form "<...some useful Beschreibung...>" zurückgegeben werden. Der Rückgabewert muss eine Zeichenkette sein Objekt sein. Wenn eine Klasse definiert repr. () aber nicht __str__() entonces __repr__() ist auch verwendet, wenn eine "informelle" Zeichenkette Darstellung von Instanzen dieser Klasse erforderlich ist. Dies wird typischerweise für die Fehlersuche verwendet, daher ist es wichtig dass die Darstellung informationsreich und eindeutig ist.

__str__(self) Aufgerufen von der str() integrierte Funktion und durch die Druckfunktion Anweisung zur Berechnung der "informellen" String-Darstellung eines Objekts zu berechnen. Dies unterscheidet sich von __repr__() insofern, als nicht unbedingt ein gültiger Python-Ausdruck sein muss Ausdruck sein muss: eine bequemere oder prägnantere Darstellung kann stattdessen. Der Rückgabewert muss ein String-Objekt sein.

22voto

prosti Punkte 34344

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

20voto

Tel Punkte 181

Es könnte sich lohnen, das zu überprüfen.

Gibt es eine Python-Entsprechung zu Perls Data::Dumper?

Meine Empfehlung ist folgende.

https://gist.github.com/1071857

Beachten Sie, dass es in Perl ein Modul namens Data::Dumper gibt, das Objektdaten in Perl-Quellcode zurückübersetzt (NB: es übersetzt NICHT den Code zurück in den Quellcode, und fast immer wollen Sie die Objektmethodenfunktionen nicht in der Ausgabe haben). Dies kann für die Persistenz verwendet werden, aber der übliche Zweck ist die Fehlersuche.

Es gibt eine Reihe von Dingen, die Standard-Python pprint nicht erreicht, insbesondere hält es einfach an, wenn es eine Instanz eines Objekts sieht und gibt Ihnen den internen Hex-Zeiger des Objekts (errr, dieser Zeiger ist übrigens nicht sehr nützlich). Kurz gesagt, in Python dreht sich alles um dieses großartige objektorientierte Paradigma, aber die Werkzeuge, die man von Haus aus bekommt, sind für die Arbeit mit etwas anderem als Objekten konzipiert.

Mit dem Perl Data::Dumper können Sie steuern, wie tief Sie gehen wollen, und auch zirkulär verbundene Strukturen erkennen (das ist wirklich wichtig). Dieser Prozess ist in Perl grundsätzlich einfacher zu erreichen, weil Objekte keine besondere Magie haben, die über ihren Segen hinausgeht (ein universell gut definierter Prozess).

15voto

William McVey Punkte 452

In den meisten Fällen ist die Verwendung von __dict__ o dir() werden Sie die gewünschten Informationen erhalten. Sollten Sie mehr Details benötigen, enthält die Standardbibliothek die prüfen Modul, mit dem Sie eine beeindruckende Menge an Details erzielen können. Einige der echten Nuggets von Informationen umfassen:

  • Namen der Funktions- und Methodenparameter
  • Klassenhierarchien
  • Quellcode der Implementierung von Funktionen/Klassenobjekten
  • lokale Variablen aus einem Frame-Objekt

Wenn Sie nur nach "Welche Attributwerte hat mein Objekt?" suchen, dann dir() y __dict__ sind wahrscheinlich ausreichend. Wenn Sie wirklich in den aktuellen Zustand beliebiger Objekte eindringen wollen (bedenken Sie, dass in Python fast alles ein Objekt ist), dann inspect ist eine Überlegung wert.

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