2009-06-17 18 views
168

Ich beginne Code in verschiedenen Projekten mit Python (einschließlich Django Web-Entwicklung und Panda3D Spielentwicklung).Wie schaue ich in ein Python-Objekt?

Um mir zu helfen, zu verstehen, was vor sich geht, würde ich gerne in die Python-Objekte "schauen", um zu sehen, wie sie ticken - wie ihre Methoden und Eigenschaften.

Also sagen, ich habe ein Python-Objekt, was würde ich brauchen, um den Inhalt auszudrucken? Ist das überhaupt möglich?

Antwort

46

Lesen Sie zuerst die Quelle.

Zweitens, verwenden Sie die dir() Funktion.

+60

Ich würde diese Reihenfolge umkehren. – bayer

+4

Die Quelle ist informativer als dir() und eine bessere Gewohnheit zu entwickeln. –

+11

ich bitte mich zu unterscheiden. dir() ist nur so viel schneller und in 99% der Fälle lasst ihr herausfinden, was ihr in Kombination mit help() braucht. – bayer

6

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

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

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

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

__author__ = "Mark Pilgrim ([email protected])" 


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__ 
+3

Dies funktioniert gut in Python 3, wenn Sie nur Parens um die Drucke hinzufügen. – ConstantineK

212

Python hat einen starken Satz von Introspektionsfunktionen.

Werfen Sie einen Blick auf die folgende built-in functions:

type()dir() und sind besonders nützlich, um den Typ eines Objekts und dessen Satz von Attributen für die Inspektion, respectively.

+13

Wusste nicht, dass der Begriff "Introspektion" war. Das ist eine große Hilfe! Sowie all die Funktionen, die du mir gegeben hast ... Danke! – littlejim84

+2

Eigenschaft, Klassenmethode und statische Methode sind nicht mit Introspektion verbunden. Diese Methoden erstellen alle spezielle Typen von Objekten, die verwendet werden können, um Klassen mit speziellem Verhalten zu definieren, sind aber bei der Überprüfung dieser Klassen oder Konstrukte nicht hilfreich. – SingleNegationElimination

+0

Die Antwort von @Brian unten zeigt Ihnen, wie Sie auch den Quellcode verschiedener Python-Objekte in Python anzeigen können. Das ist, was ich ursprünglich suchte, und ich bin sicher, dass ich nicht alleine sein werde. (Es könnte einen Verweis auf seine Antwort in dieser Antwort wert sein, da es am meisten akzeptiert ist.) – michaelavila

0

Zusätzlich wenn Sie in die Liste und Wörterbücher suchen möchten, können Sie pprint()

2

pprint und dir zusammen arbeiten sehr verwenden

4

Wenn Sie auf Parameter und Methoden aussehen wollen, wie andere hingewiesen haben aus können Sie auch pprint oder dir()

verwenden Wenn Sie den ist-Wert des Inhalts sehen möchten, können Sie

tun

object.__dict__

17

Wenn dies zur Exploration ist, um zu sehen, was vor sich geht, würde ich empfehlen, IPython zu betrachten. Dies fügt verschiedene Verknüpfungen hinzu, um eine Objektdokumentation, Eigenschaften und sogar Quellcode zu erhalten. Zum Beispiel hängt ein "?" zu einer Funktion wird die Hilfe für das Objekt geben (effektiv eine Abkürzung für "Hilfe (Obj)", während mit zwei? 's ("func??") wird der Quellcode angezeigt, wenn es verfügbar ist.

Es gibt auch eine Menge zusätzlicher Annehmlichkeiten, wie Tabulatorvervollständigung, hübsches Drucken von Ergebnissen, Ergebnishistorie usw., die es sehr nützlich für diese Art der explorativen Programmierung machen.

Für weitere programmatische Verwendung von Selbstbeobachtung, die grundlegenden builtins wie dir(), vars() werden getattr usw. nützlich sein, aber es ist auch Ihre Zeit wert, die inspect Modul zu überprüfen. Um die Quelle einer Funktion zu holen, verwenden Sie „inspect.getsource“ zB Anwendung auf sich selbst:

>>> 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 wird auch häufig nützlich, wenn Sie mit der Verpackung oder Manipulation von Funktionen zu tun haben, wie es die Namen geben und den Standard Werte von Funktionsparametern.

136

object.__dict__

+2

Funktioniert nicht mit Steckplätzen –

+0

das funktioniert nicht. – Sajuuk

+0

Funktioniert für mich (Python 3.6.2). – OmarOthman

6

Andere haben bereits die dir erwähnt() eingebaut, die klingt wie das, was Sie suchen, aber hier ist ein weiterer guter Tipp. Viele Bibliotheken - einschließlich der meisten Standardbibliotheken - sind in Quellform verteilt. Das bedeutet, dass Sie den Quellcode direkt lesen können. Der Trick besteht darin, es zu finden; zum Beispiel:

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

Die * .pyc Datei kompiliert wird, so die Hinter 'c' entfernen und die kompilierten * .py-Datei in einem Editor oder Datei-Viewer öffnen:

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

I Ich habe festgestellt, dass dies sehr nützlich ist, um Dinge zu entdecken, die von einer bestimmten API ausgelöst werden. Diese Art von Details ist in der Python-Welt selten gut dokumentiert.

40

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

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

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

foo() 
    foo! 

Hilfe können Sie den Docstring lesen und bekommen eine Vorstellung davon, welche Attribute eine Klasse haben könnte, was ziemlich hilfreich ist.

+2

Was ist, wenn die Methode keinen Docstring hat, d. H. Keine Dokumentation? – Sajuuk

1

Wenn Sie in ein Live-Objekt schauen möchten, ist Pythons inspect Modul eine gute Antwort. Im Allgemeinen funktioniert es, um den Quellcode von Funktionen zu erhalten, die in einer Quelldatei irgendwo auf der Festplatte definiert sind. Wenn Sie die Quelle von Live-Funktionen und Lambdas abrufen möchten, die im Interpreter definiert wurden, können Sie von dill verwenden. Es kann auch den Code für gebundene oder ungebundene Klassenmethoden und -funktionen abrufen, die in Curries definiert sind ... Sie können diesen Code jedoch möglicherweise 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 

>>> 
2

Es gibt eine Bibliothek bauen nur für diesen Zweck Python-Code ist: inspect Eingeführt in Python 2.7

10

Wenn Sie in einer GUI für diese interessiert sind, nehmen Sie einen Blick auf objbrowser. Es verwendet das inspect-Modul aus der Python-Standardbibliothek für die Objekt-Introspektion darunter.Versuchen

objbrowserscreenshot

6

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) 

Ausgang:

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

Zwei große Werkzeuge für die Prüfung von Code sind:

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

  2. Eclipse mit der PyDev plugin. Es hat einen exzellenten 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 auszuprobieren, oder geben Sie das Objekt ein und drücken Sie '.' um Codehinweise für Sie zu geben.

enter image description here

0

Vars (obj) gibt die Attribute eines Objekts.

Verwandte Themen