Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 21 Debugging
  Pfeil 21.1 Der Debugger
  Pfeil 21.2 Inspizieren von Instanzen – inspect
    Pfeil 21.2.1 Datentypen, Attribute und Methoden
    Pfeil 21.2.2 Quellcode
    Pfeil 21.2.3 Klassen und Funktionen
  Pfeil 21.3 Formatierte Ausgabe von Instanzen – pprint
  Pfeil 21.4 Logdateien – logging
    Pfeil 21.4.1 Das Meldungsformat anpassen
    Pfeil 21.4.2 Logging Handler
  Pfeil 21.5 Automatisiertes Testen
    Pfeil 21.5.1 Testfälle in Docstrings – doctest
    Pfeil 21.5.2 Unit Tests – unittest
  Pfeil 21.6 Traceback-Objekte – traceback
  Pfeil 21.7 Analyse des Laufzeitverhaltens
    Pfeil 21.7.1 Laufzeitmessung – timeit
    Pfeil 21.7.2 Profiling – cProfile
    Pfeil 21.7.3 Tracing – trace


Galileo Computing - Zum Seitenanfang

21.2 Inspizieren von Instanzen – inspect  Zur nächsten ÜberschriftZur vorigen Überschrift

Das Modul inspect stellt Funktionen bereit, über die der Programmierer detaillierte Informationen über eine Instanzgi erlangen kann. So könnte beispielsweise der Inhalt einer Klasse oder die Parameterliste einer Funktion ermittelt werden. Damit eignet sich inspect besonders zum Erstellen von detaillierten Debug-Ausgaben.

Grundsätzlich lässt sich die Funktionalität von inspect in vier Teilbereiche gliedern, die im Folgenden erklärt werden sollen:

  • Funktionen, die sich auf Datentypen, Attribute und Methoden einer Instanz beziehen
  • Funktionen, die sich auf ein Stück des Quellcodes beziehen, das im Zusammenhang mit einer Instanz steht
  • Funktionen, die sich auf Klassen- und Funktionsobjekte beziehen

Bevor Sie die Beispiele dieser Kapitel ausführen können, müssen Sie das Modul inspect einbinden:

>>> import inspect

Galileo Computing - Zum Seitenanfang

21.2.1 Datentypen, Attribute und Methoden  Zur nächsten ÜberschriftZur vorigen Überschrift

In diesem Kapitel sollen die Funktionen des Moduls inspect besprochen werden, mit deren Hilfe der Programmierer Informationen über den Datentyp, Attribute oder Methoden einer Instanz abfragen kann. Im Folgenden werden die wichtigsten dieser Funktionen besprochen.

inspect.getmembers(object[, predicate])

Gibt alle Attribute und Methoden, auch Member genannt, der Instanz object in Form einer Liste von Tupeln zurück. Jedes Tupel enthält dabei den Namen des jeweiligen Members als erstes Element und den Wert des Members als zweites Element. Im Falle einer Methode entspricht das Funktionsobjekt dem Wert des Members. Die zurückgegebene Liste ist nach Member-Namen sortiert.

>>> class klasse(object):
... def __init__(self): ... self.a = 1 ... self.b = 2 ... self.c = 3
... def hallo(self): ... return "welt" ... >>> inspect.getmembers(klasse()) [('__class__', <class '__main__.klasse'>), […] ('a', 1), ('b', 2), ('c', 3), ('hallo', <bound method klasse.hallo of <__main__.klasse object at 0xb7a9d08c>>)]

Für den optionalen Parameter predicate kann eine Filterfunktion übergeben werden. Diese Funktion wird für jeden Member der Instanz object aufgerufen und bekommt diesen als einzigen Parameter übergeben. Es werden alle Member in die Ergebnisliste aufgenommen, für die die Filterfunktion True zurückgegeben hat.

>>> inspect.getmembers(klasse(), lambda x: inspect.ismethod(x)) 
[('__init__', <bound method klasse.__init__ of <__main__.klasse  
object at 0xb7a9df2c>>), ('hallo', <bound method klasse.hallo of  
<__main__.klasse object at 0xb7a9df2c>>)]

In diesem Fall wurde eine Lambda-Form übergeben, die True zurückgibt, wenn es sich bei dem Member x um eine Methode handelt. Dementsprechend klein ist die Ergebnisliste. Auf die verwendete Funktion ismethod wird später noch eingegangen.

Zusätzlich zu getmembers sind im Modul inspect eine Menge Funktionen enthalten, deren Namen allesamt mit is beginnen. Eine dieser Funktionen wurde im vorangegangenen Beispiel bereits erfolgreich eingesetzt. Die folgende Tabelle listet die wichtigsten dieser Funktionen auf.


Tabelle 21.1  Auf Member bezogene Funktionen des Moduls inspect
Funktion Rückgabewert
isclass(object)

True, wenn object eine Klasse ist, andernfalls False.

ismodule(object)

True, wenn object ein Modul ist, andernfalls False.

ismethod(object)

True, wenn object eine Methode ist, andernfalls False.

isfunction(object)

True, wenn object eine Funktion ist, andernfalls False.

istraceback(object)

True, wenn object ein Traceback-Objekt ist, andernfalls False.

iscode(object)

True, wenn object ein Code-Objekt ist, andernfalls False. Näheres zum Code-Objekt erfahren Sie im nächsten Kapitel.

isbuiltin(object)

True, wenn object eine Built-in Function ist, andernfalls False.

isroutine(object)

True, wenn object eine Funktion oder Methode ist, andernfalls False.


Grundsätzlich werden die Methoden folgendermaßen verwendet:

>>> def a(): 
...     print "Hallo Welt" 
... 
>>> inspect.isbuiltin(a) 
False 
>>> inspect.isfunction(a) 
True 
>>> inspect.isroutine(a) 
True

Damit sind die wichtigsten Funktionen des Moduls inspect, die sich auf Datentypen, Attribute oder Methoden beziehen, beschrieben.


Galileo Computing - Zum Seitenanfang

21.2.2 Quellcode  Zur nächsten ÜberschriftZur vorigen Überschrift

In diesem Abschnitt sollen die wichtigsten Funktionen des Moduls inspect behandelt werden, die sich direkt auf den Quellcode beispielsweise einer Funktion beziehen.

inspect.getfile(object)

Gibt den Namen der Datei zurück, in der das Objekt object definiert wurde. Dabei kann es sich sowohl um eine Quellcode-Datei als auch um eine Bytecode-Datei handeln.

Diese Funktion wirft eine TypeError-Exception, wenn es sich bei object um ein eingebautes Objekt, beispielsweise eine Built-in Function handelt. Das liegt daran, dass Built-in Functions intern in C implementiert sind und somit keiner Quelldatei zugeordnet werden können.

>>> inspect.getfile(inspect.getfile) 
'/usr/lib/python2.5/inspect.py'

In diesem Beispiel wurde die Funktion getfile verwendet, um herauszufinden, in welcher Quelldatei sie selbst definiert ist.

inspect.getmodule(object)

Gibt die Modulinstanz des Moduls zurück, in dem das Objekt object definiert wurde.

>>> inspect.getmodule(inspect.getmodule) 
<module 'inspect' from 'C:\Programme\Python25\lib\inspect.pyc'>

In diesem Beispiel wurde getmodule dazu verwendet, den Pfad des Moduls herauszufinden, in dem sie selbst definiert ist.

inspect.getsourcefile(object)

Gibt den Namen der Quellcode-Datei zurück, in der das Objekt object definiert wurde. Diese Funktion wirft eine TypeError-Exception, wenn es sich bei object um ein eingebautes Objekt, beispielsweise eine Built-in Function handelt. Das liegt daran, dass diese Objekte entweder intern in C implementiert sind oder die Quelldatei nur als Kompilat vorliegt. Dem Objekt kann also kein tatsächlicher Quellcode zugeordnet werden. Diese Einschränkung betrifft auch viele Funktionen der Standardbibliothek.

>>> inspect.getsourcefile(inspect.getsourcefile) 
'/usr/lib/python2.5/inspect.py'

In diesem Fall wurde getsourcefile dazu verwendet, die Quellcodedatei herauszufinden, in der die Funktion selbst definiert ist.

inspect.getsourcelines(object)

Gibt ein Tupel mit zwei Elementen zurück. Das erste ist eine Liste von Strings, die alle dem Objekt object zugeordneten Quellcodezeilen enthält. Das zweite Element des zurückgegebenen Tupels ist die Zeilennummer der ersten dem Objekt object zugeordneten Quellcodezeile.

Für object kann ein Modul, eine Methode, eine Funktion, ein Traceback-Objekt oder ein Frame-Objekt übergeben werden. Näheres zum Frame-Objekt erfahren Sie im nächsten Kapitel.

Die Funktion wirft eine IOError-Exception, wenn der Quellcode zum Objekt object nicht geladen werden konnte.

>>> inspect.getsourcelines(inspect.getsourcelines) 
(['def getsourcelines(object):\n', […], 610)

In diesem Fall wurde die Funktion getsourcelines dazu verwendet, die Quellcodezeilen ihrer eigenen Definition zurückzugeben. Beachten Sie, dass das Auslassungszeichen keine rekursive Liste andeutet, sondern weitere Quellcodezeilen andeuten soll.

inspect.getsource(object)

Gibt die dem Objekt object zugeordneten Quellcodezeilen in einem einzigen String zurück. Die Funktion unterscheidet sich demzufolge nur im Rückgabewert von getsourcelines.

Für object kann ein Modul, eine Methode, eine Funktion, ein Traceback-Objekt oder ein Frame-Objekt übergeben werden.

Die Funktion wirft eine IOError-Exception, wenn der Quellcode zum Objekt object nicht geladen werden konnte.


Galileo Computing - Zum Seitenanfang

21.2.3 Klassen und Funktionen  topZur vorigen Überschrift

In diesem Abschnitt sollen die wichtigsten Funktionen des Moduls inspect behandelt werden, die sich auf Klassen und Funktionen beziehen.

inspect.getclasstree(classes[, unique])

Gibt die Vererbungshierarchie der übergebenen Klassen in Form eines Baums [Bei einem Baum handelt es sich grundsätzlich um nichts anderes als um eine verschachtelte Liste. Gerade im Zusammenhang mit getclasstree ist die zurückgegebene Liste ausdrücklich als Baum zu sehen. ] zurück. Im ersten Teil des Beispielprogramms bauen wir daher zunächst eine Klassenhierarchie auf:

>>> class a(object): 
...     pass 
... 
>>> class b(a): 
...     pass 
... 
>>> class c(a): 
...     pass 
... 
>>> class d(b): 
...     pass 
... 
>>> class e(b): 
...     pass 
...

Abbildung 21.2 veranschaulicht die Hierarchie.

Abbildung 21.2  Die Klassenhierarchie

Die Funktion getclasstree bereitet Teile dieser Hierarchie zu einem Baum auf. Dazu müssen beim Funktionsaufruf die Klassen übergeben werden, die im resultierenden Baum enthalten sein sollen. Im folgenden Beispiel soll die Hierarchie um die Klasse b erzeugt werden:

>>> inspect.getclasstree([b]) 
[ 
(<class '__main__.a'>, (<type 'object'>,)), 
    [ 
    (<class '__main__.b'>, (<class '__main__.a'>,)) 
    ] 
]

Der resultierende Baum, hier aus Gründen der Übersichtlichkeit formatiert, besteht aus einer Liste von Tupeln, die jeweils eine Klasse repräsentieren. Ein solches Tupel ist folgendermaßen aufgebaut:

(Klasse, (Basisklassen))

Nach jedem solchen Tupel kann eine eingebettete Liste folgen, die alle Klassen enthält, die von der Klasse abgeleitet sind, die das Tupel beschreibt. Auch diese eingebetteten Listen bestehen aus Tupeln des obigen Formats.

Wie Sie sehen, wurde im Beispiel ein Baum erzeugt, der nur die Klasse b selbst und ihre Basisklasse a enthält.

Für den ersten Parameter classes von getclasstree muss eine Liste übergeben werden, die auch, anders als im vorangegangenen Beispiel, mehrere Klassen enthalten darf, die dann alle im resultierenden Baum vorkommen. So soll im folgenden Beispiel die Hierarchie um die Klassen b und a erstellt werden:

>>> inspect.getclasstree([b, a]) 
[ 
(<type 'object'>, ()), 
    [ 
    (<class '__main__.a'>, (<type 'object'>,)), 
        [ 
        (<class '__main__.b'>, (<class '__main__.a'>,)) 
        ] 
    ] 
]

Der resultierende Baum enthält die aufgelisteten Klassen a und b sowie die Basisklasse object von a.

Wenn für den optionalen Parameter unique True übergeben wird, taucht jede Klasse auch im Falle von Mehrfachvererbung nur ein einziges Mal im Klassenbaum auf.

inspect.getmro(cls)

Gibt ein Tupel zurück, das alle Basisklassen der Klasse cls inklusive der Klasse cls selbst enthält. Die Klassen sind dabei so angeordnet, dass die allgemeinste Basisklasse als letzte im Tupel enthalten ist. Das bedeutet umgekehrt, dass die Klasse cls selbst als erstes Element des resultierenden Tupels geführt wird.

>>> inspect.getmro(b) 
( 
<class '__main__.b'>, 
<class '__main__.a'>, 
<type 'object'> 
)

Dieses Beispiel bezieht sich auf die bei getclasstree angelegte Klassenhierarchie.

inspect.getargspec(func)

Gibt die Funktionsschnittstelle der Funktion func, also die Namen und vordefinierten Werte der Funktionsparameter zurück. Das Ergebnis ist ein Tupel mit vier Elementen. Das erste Element ist eine Liste mit den Namen aller Parameter. Das zweite und das dritte Element des zurückgegebenen Tupels enthalten den Parameternamen, über den beliebige Positions- oder Schlüsselwortparameter funktionsintern angesprochen werden. Das letzte Element des Tupels ist ein Tupel mit vordefinierten Werten der Parameter.

>>> def funktion(a, b, c=1, d=2, *args): 
...     pass 
... 
>>> inspect.getargspec(funktion) 
(['a', 'b', 'c', 'd'], 'args', None, (1, 2))

In diesem Fall besteht die Funktionsschnittstelle also aus den Parametern a, b, c und d sowie aus einer Möglichkeit, beliebige weitere Positionsparameter zu übergeben. Auf diese zusätzlichen Parameter wird funktionsintern über den Namen args zugegriffen. Eine Möglichkeit, beliebige Schlüsselwortparameter zu übergeben, gibt es nicht, das entsprechende Element des Tupels ist None. Schlussendlich können dem Tupel noch die vordefinierten Werte für die letzten beiden Parameter c und d entnommen werden.

inspect.getargvalues(frame)

Gibt Informationen über die einer Funktion tatsächlich übergebenen Werte zurück. Der Rückgabewert ist ein Tupel mit vier Elementen. Die ersten drei Elemente des Tupels entsprechen denen des Tupels, das von der Funktion getargspec zurückgegeben wird. Das vierte Element des Tupels enthält ein Dictionary mit den Namen und Werten aller lokalen Variablen des übergebenen Frame-Objekts frame.

Das sogenannte Frame-Objekt repräsentiert einen Codeblock und kann mithilfe der Funktion inspect.currentframe erzeugt werden.

>>> def funktion(a, b, c=1, d=2): 
...     print inspect.getargvalues(inspect.currentframe()) 
... 
>>> funktion("Hallo", "Welt") 
(['a', 'b', 'c', 'd'], None, None, 
{'a': 'Hallo', 'c': 1, 'b': 'Welt', 'd': 2})

Beachten Sie, dass die beiden None-Elemente des Tupels nur Bedeutung haben, wenn die Funktionsschnittstelle das Übergeben beliebiger Positions- oder Schlüsselwortparameter ermöglicht, was hier nicht der Fall ist.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de