Announcement

Collapse
No announcement yet.

Introspection mit Python: Der API-Helper

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Introspection mit Python: Der API-Helper

    Eine der bekannten Stärken Pythons ist mit Sicherheit die Fähigkeit zur Introspection (=Selbstprüfung; in Java-Kreisen auch als Reflection bekannt); d.h. Objekte können allgemein gesagt näher "untersucht" werden. Oft ist diese Eigenschaft sehr hilfreich - zum Beispiel, wenn der Entwickler Informationen über ein bestimmtes Objekt (Modul, Klasse, Methode, Funktion et cetera) benötigt (schließlich ist in Python "alles" ein Objekt).

    Introspektion? Klingt kompliziert, was hat es damit auf sich? Es handelt sich um Code, welcher Objekte im Speicher unter die Lupe nimmt und Informationen zurückliefert; bei Bedarf können die Objekte dann auch manipuliert werden.

    Das Gesagte soll anhand der Funktion <i>help()</i> demonstriert werden. Diese Funktion untersucht beispielsweise ein beliebiges Modul und stellt dem Anwender eine formatierte Auflistung aller Funktionen des Moduls - nebst <i>docstring</i> - zur Verfügung. Es ist naheliegend, dass man auf diese Art einfache Dokumentaionssysteme selbst "basteln" kann. Der Beispiel-Code für den API-Helper sieht so aus:
    <PRE>
    #!/usr/bin/env python

    def help(object, spacing=10, collapse=1):
    """Druckt Methoden und Doc-Strings."""

    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    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__
    </PRE>
    Aus der Funktions-Deklaration geht hervor, dass drei Parameter übergeben werden: <i>object</i>, <i>spacing</i> und <i>collapse</i> - die beiden letzten Parameter sind übrigens optional, da ihnen ein Default-Wert zugewiesen wurde. Die Funktion liefert auch keinen Wert zurück, da das <i>return</i>-Statement fehlt.

    Rufen wir das Programm als standalone auf:
    <PRE>
    % python introspection.py
    Druckt Methoden und Doc-Strings.
    </PRE>
    Das ist nicht gerade eindrucksvoll, oder? Die ganze Power der Introspektion kommt aber so zur Geltung:
    <PRE>
    &gt;&gt;&gt;from introspection import help
    &gt;&gt;&gt;li = []
    &gt;&gt;&gt;help(li)
    ...
    ...
    append L.append(object) -- append object to end
    count L.count(value) -> integer -- return number of occurrences of value
    extend L.extend(iterable) -- extend list by appending elements from the iterable
    index L.index(value, [start, [stop]]) -> integer -- return first index of value
    insert L.insert(index, object) -- insert object before index
    pop L.pop([index]) -> item -- remove and return item at index (default last)
    remove L.remove(value) -- remove first occurrence of value
    reverse L.reverse() -- reverse *IN PLACE*
    sort L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1
    </PRE>
    Mit ein paar Zeilen Python-Code erhält der Nutzer ein veritables Werkzeug für den täglichen Gebrauch. Ein Dank geht an <a href="http://diveintopython.org/" style="text-decoration:none" target="_blank">Mark Pilgrim</a> für sein fantastisches Python-Tutorial "Dive into Python" - das Beispiel wurde daraus entnommen.

    Viel Spass.

    Thomas Kaufmann
Working...
X