Wie schaue ich in ein Python-Objekt?


291

Ich fange an, in verschiedenen Projekten mit Python zu programmieren (einschließlich Django-Webentwicklung und Panda3D-Spieleentwicklung).

Um zu verstehen, was los ist, möchte ich im Grunde genommen in die Python-Objekte schauen, um zu sehen, wie sie ticken - wie ihre Methoden und Eigenschaften.

Angenommen, ich habe ein Python-Objekt. Was würde ich benötigen, um dessen Inhalt auszudrucken? Ist das überhaupt möglich?

Antworten:


352

Python verfügt über zahlreiche Funktionen zur Selbstbeobachtung.

Sehen Sie sich die folgenden integrierten Funktionen an :

type()und dir()sind besonders nützlich, um den Typ eines Objekts bzw. seinen Satz von Attributen zu untersuchen.


25
Wusste nicht, dass der Begriff "Selbstbeobachtung" war. Das ist eine große Hilfe! Ebenso wie alle Funktionen, die Sie mir gegeben haben ... Danke!
littlejim84

2
Eigenschaft, Klassenmethode und statische Methode hängen nicht mit der Selbstbeobachtung zusammen. Diese Methoden erstellen alle spezielle Objekttypen, mit denen Klassen mit speziellem Verhalten definiert werden können, helfen jedoch nicht bei der Überprüfung dieser Klassen oder Konstrukte.
SingleNegationElimination

Die Antwort von @Brian unten zeigt Ihnen, wie Sie auch den Quellcode verschiedener Python-Objekte in Python anzeigen können. Das ist es, wonach ich ursprünglich gesucht habe und ich bin sicher, dass ich nicht alleine sein werde. (Es könnte sich lohnen, einen Verweis auf seine Antwort in diese Antwort aufzunehmen, da sie am meisten akzeptiert wird.)
Michaelavila

Es ist wie "IntelliSense" für Python. Ich liebe es.
Bruno Bieri

7
Ich denke, es ist eine schlechte Antwort. anstatt uns eine Lösung zu geben, gibt es uns einfach alles, was damit in der Dokumentation zu
tun hat

176

object.__dict__


12
vars(object)ist dafür gemacht.
Liberforce

6
Eigentlich from pprint import pprint; pprint(vars(object))gab mir eine wirklich schöne Sicht auf den Inhalt meines Objekts. Vielen Dank an @liberforce
N. Maks

der beste Weg, um Objekt und seinen Inhalt in einer Zeichenfolge zu sehen
Peter Krauss

Dies ist eine großartige Möglichkeit, Objekte zu sehen, die Darstellungsmethoden implementieren, oder Objekte wie googleapiclient.errors.HttpError, die beim Drucken mit Sicherheit unzureichende Informationen drucken, danke @ mtasic85
Felipe Valdes

65

Lesen Sie zuerst die Quelle.

Zweitens verwenden Sie die dir()Funktion.


92
Ich würde diese Reihenfolge umkehren.
Bayer

5
Die Quelle ist informativer als dir () und eine bessere Angewohnheit, sich zu entwickeln.
S.Lott

14
Ich bin anderer Ansicht. dir () ist einfach viel schneller und in 99% der Fälle können Sie herausfinden, was Sie in Kombination mit help () benötigen.
Bayer

7
Ich stimme normalerweise nutzlos zu. In den meisten Fällen reicht ein einfacher Aufruf von dir () aus, sodass Sie nicht mehr den Quellcode durchsehen müssen.
Sasha Chedygov

3
Manchmal kann es nützlich sein, Objekte zur Laufzeit zu überprüfen, Quellen jedoch nicht. ZB httplib.py Klassen und ihre Methoden :).
Denis Barmenkov

61

Ich bin überrascht, dass noch niemand die Hilfe erwähnt hat!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

Mithilfe der Hilfe können Sie die Dokumentzeichenfolge lesen und sich ein Bild davon machen, welche Attribute eine Klasse möglicherweise hat. Dies ist sehr hilfreich.


Dann verwenden Sie die anderen hier genannten Techniken. Aber wenn der Docstring verfügbar ist, betrachten Sie ihn als Canon.
Edward Falk

Ich bin nicht sicher, ob Python diese Funktion in den letzten Jahren aktualisiert hat, aber "help (object_name)" bietet einen vollständigen Überblick in einem stark strukturierten Format. Es ist ein Wächter. Vielen Dank.
Brian Cugelman

27

Wenn dies zur Erkundung dient, um zu sehen, was los ist, würde ich empfehlen, sich IPython anzusehen . Dadurch werden verschiedene Verknüpfungen hinzugefügt, um eine Objektdokumentation, Eigenschaften und sogar Quellcode zu erhalten. Zum Beispiel ein "?" zu einer Funktion gibt die Hilfe für das Objekt (effektiv eine Verknüpfung für "Hilfe (obj)", wobei bei Verwendung von zwei? 's (" func??") der Quellcode angezeigt wird, wenn er verfügbar ist.

Es gibt auch viele zusätzliche Annehmlichkeiten wie das Ausfüllen von Registerkarten, das hübsche Drucken von Ergebnissen, den Ergebnisverlauf usw., die es für diese Art der explorativen Programmierung sehr praktisch machen.

Für weitere programmatische Verwendung von Selbstbeobachtung, wie die grundlegenden builtins dir(), vars(), getattrwird usw. nützlich sein, aber es lohnt sich, Ihre Zeit das zu prüfen , inspizieren Modul. Um die Quelle einer Funktion abzurufen, verwenden Sie " inspect.getsource", z. B. und wenden Sie sie auf sich selbst an:

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec ist auch häufig nützlich, wenn Sie sich mit dem Umschließen oder Bearbeiten von Funktionen befassen, da hier die Namen und Standardwerte der Funktionsparameter angegeben werden.



9

Sie können die Attribute eines Objekts mit dir () in der Shell auflisten:

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Natürlich gibt es auch das Inspect-Modul: http://docs.python.org/library/inspect.html#module-inspect


8
"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"


def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":
    print help.__doc__

4
Dies funktioniert in Python 3 einwandfrei, wenn Sie nur Parens um die Ausdrucke hinzufügen.
ConstantineK

8

Versuchen Sie es mit 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(), indent='    ', depth=2, width=30, seq_length=6,
              show_protected=True, show_private=False, show_static=True,
              show_properties=True, show_address=True)

Ausgabe:

__main__.A at 0x1debd68L (
    _p = 8, 
    foo = [0, 1, 2, ..., 7, 8, 9], 
    s = 5
)

7

Andere haben bereits das eingebaute dir () erwähnt, das sich nach dem anhört, wonach Sie suchen, aber hier ist ein weiterer guter Tipp. Viele Bibliotheken - einschließlich der meisten Standardbibliotheken - werden in Quellform verteilt. Das heißt, Sie können den Quellcode ziemlich einfach direkt lesen. Der Trick besteht darin, es zu finden; beispielsweise:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

Die * .pyc-Datei wird kompiliert. Entfernen Sie daher das nachfolgende 'c' und öffnen Sie die nicht kompilierte * .py-Datei in Ihrem bevorzugten Editor oder Datei-Viewer:

/usr/lib/python2.5/string.py

Ich fand das unglaublich nützlich, um herauszufinden, welche Ausnahmen von einer bestimmten API ausgelöst werden. Diese Art von Details ist in der Python-Welt selten gut dokumentiert.


7

Während pprintbereits von anderen erwähnt wurde, möchte ich einen Kontext hinzufügen.

Das pprint-Modul bietet die Möglichkeit, beliebige Python-Datenstrukturen in einer Form „hübsch zu drucken“, die als Eingabe für den Interpreter verwendet werden kann. Wenn die formatierten Strukturen Objekte enthalten, die keine grundlegenden Python-Typen sind, kann die Darstellung möglicherweise nicht geladen werden. Dies kann der Fall sein, wenn Objekte wie Dateien, Sockets, Klassen oder Instanzen sowie viele andere integrierte Objekte enthalten sind, die nicht als Python-Konstanten dargestellt werden können.

pprint Möglicherweise sind Entwickler mit PHP-Hintergrund, die nach einer Alternative zu suchen, sehr gefragt var_dump() .

Objekte mit einem dict-Attribut können mithilfe von pprint()gemischt mit gut ausgegeben werden vars(), wodurch das __dict__Attribut für ein Modul, eine Klasse, eine Instanz usw.: Zurückgegeben wird.

from pprint import pprint
pprint(vars(your_object))

Es ist also keine Schleife erforderlich .

Um alle im globalen oder lokalen Bereich enthaltenen Variablen zu sichern, verwenden Sie einfach:

pprint(globals())
pprint(locals())

locals()zeigt in einer Funktion definierte Variablen.
Es ist auch nützlich , um Zugriffsfunktionen mit ihren entsprechenden Namen als String - Schlüssel, unter anderen Verwendungen :

locals()['foo']() # foo()
globals()['foo']() # foo()

Ebenso mit dir() Sie den Inhalt eines Moduls oder die Attribute eines Objekts anzeigen.

Und es gibt noch mehr.


4

Wenn Sie sich Parameter und Methoden ansehen möchten, wie andere bereits betont haben, können Sie pprintoder verwendendir()

Wenn Sie den tatsächlichen Wert des Inhalts sehen möchten, können Sie dies tun

object.__dict__


4

Zwei großartige Tools zum Überprüfen von Code sind:

  1. IPython . Ein Python-Terminal, mit dem Sie die Tab-Vervollständigung überprüfen können.

  2. Eclipse mit dem PyDev-Plugin . Es verfügt über einen hervorragenden Debugger, mit dem Sie an einer bestimmten Stelle brechen und Objekte untersuchen können, indem Sie alle Variablen als Baum durchsuchen. Sie können sogar das eingebettete Terminal verwenden, um Code an dieser Stelle zu testen, oder das Objekt eingeben und '.' Drücken. damit es Code-Hinweise für Sie gibt.

Geben Sie hier die Bildbeschreibung ein


3

pprint und dir arbeiten hervorragend zusammen


3

Es gibt eine Python-Codebibliothek, die nur für diesen Zweck erstellt wurde: inspect Eingeführt in Python 2.7


3

Wenn Sie interessiert sind , den Quellcode der Funktion zu sehen , zu dem Objekt entspricht myobj, können Sie eintippen iPythonoder Jupyter Notebook:

myobj??


2
import pprint

pprint.pprint(obj.__dict__)

oder

pprint.pprint(vars(obj))

Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Alexander

1

Wenn Sie in ein Live-Objekt schauen möchten, ist das Python- inspectModul eine gute Antwort. Im Allgemeinen funktioniert es, um den Quellcode von Funktionen abzurufen, die in einer Quelldatei irgendwo auf der Festplatte definiert sind. Wenn Sie die Quelle von Live-Funktionen und Lambdas erhalten möchten, die im Interpreter definiert wurden, können Sie dill.source.getsourcevon verwenden dill. Es kann auch den Code für gebundene oder ungebundene Klassenmethoden und -funktionen abrufen, die in Currys definiert sind. Möglicherweise können Sie diesen Code jedoch nicht ohne den Code des umschließenden Objekts kompilieren.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 


0

Wenn Sie in Listen und Wörterbüchern suchen möchten, können Sie außerdem pprint () verwenden.


0

Viele gute Tipps schon, aber der kürzeste und einfachste (nicht unbedingt der beste) muss noch erwähnt werden:

object?

-3

Versuchen Sie es mit:

print(object.stringify())
  • Wo objectist der Variablenname des Objekts, das Sie untersuchen möchten?

Dadurch wird eine gut formatierte Ausgabe mit Registerkarten gedruckt, in der die gesamte Hierarchie der Schlüssel und Werte im Objekt angezeigt wird.

HINWEIS: Dies funktioniert in Python3. Nicht sicher, ob es in früheren Versionen funktioniert

UPDATE: Dies funktioniert nicht bei allen Objekttypen. Wenn Sie auf einen dieser Typen stoßen (z. B. ein Anforderungsobjekt), verwenden Sie stattdessen einen der folgenden Typen:

  • dir(object())

oder

import pprint dann: pprint.pprint(object.__dict__)


1
Funktioniert nicht für ein 'Request'-Objekt "' Request'-Objekt hat kein Attribut 'stringify'"
AlxVallejo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.