|
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 help() demonstriert werden. Diese Funktion untersucht beispielsweise ein beliebiges Modul und stellt dem Anwender eine formatierte Auflistung aller Funktionen des Moduls - nebst docstring - 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:
#!/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__
Aus der Funktions-Deklaration geht hervor, dass drei Parameter übergeben werden: object, spacing und collapse - die beiden letzten Parameter sind übrigens optional, da ihnen ein Default-Wert zugewiesen wurde. Die Funktion liefert auch keinen Wert zurück, da das return-Statement fehlt.
Rufen wir das Programm als standalone auf:
% python introspection.py Druckt Methoden und Doc-Strings.
Das ist nicht gerade eindrucksvoll, oder? Die ganze Power der Introspektion kommt aber so zur Geltung:
>>>from introspection import help >>>li = [] >>>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
Mit ein paar Zeilen Python-Code erhält der Nutzer ein veritables Werkzeug für den täglichen Gebrauch. Ein Dank geht an Mark Pilgrim für sein fantastisches Python-Tutorial "Dive into Python" - das Beispiel wurde daraus entnommen.
Viel Spass.
Thomas Kaufmann
|