Gut verschnürt
Funktionen, Module und Pakete in Python
Module
Wie Sie Funktionen in Python schreiben, wissen Sie nun. Wächst die Zahl der Funktionen mehr und mehr, bietet es sich an, diese in Modulen zu gruppieren. Ein Modul ist einerseits eine Datei, andererseits – nachdem ein Skript die Datei mit der import-Anweisung lädt – ein Modulobjekt. Die bisher vorgestellten Dateien mit der Endung .py funktionieren auch problemlos als Module, ebenso die Datei fakultaet.py aus Listing 2.
Listing 2
01 #! /usr/bin/python 02 # encoding: iso-8859-1 03 04 def fakultaet(n): 05 """ 06 Gib die Fakultät "n!" von n>=0 zurück. 07 08 n! = 1 * 2 * … * (n-1) * n (Beispiel: 4! = 1*2*3*4 = 24) 09 Definitionsgemäß ist 0! = 1. 10 """ 11 assert n >= 0, "n darf nicht negativ sein, ist aber %s" % n 12 produkt = 1 13 for i in range(2, n+1): 14 produkt = produkt * i 15 return produkt 16 17 def _test(n, erwartet): 18 """ 19 Teste, ob fakultaet(n) gleich dem erwarteten Ergebnis ist. 20 """ 21 ergebnis = fakultaet(n) 22 print "fakultaet(%d) berechnet als %d …" % (n, ergebnis), 23 if ergebnis == erwartet: 24 print "ok" 25 else: 26 print "FEHLER!" 27 28 if __name__ == '__main__': 29 _test(0, 1) 30 _test(1, 1) 31 _test(2, 2) 32 _test(9, 362880)
Dieses Modul enthält in den Zeilen 4 bis 15 eine Funktion fakultaet zum Berechnen der so genannten Fakultät einer ganzen Zahl n, dass heißt, dem Produkt aller ganzen Zahlen von 1 bis n. Die assert-Anweisung stellt hier sicher, dass das Argument n nicht negativ ist. (Sie lernen später flexiblere Möglichkeiten zum Abfangen von Fehlern kennen.) Vor dem Eintritt in die for-Schleife (Zeilen 12 und 14) setzt die Funktion den spätere Rückgabewert auf "1".
Der Aufruf der range-Funktion in Zeile 13 bedarf einer Erläuterung: So wie der Slice "Hallo"[3:2] (erster Index größer oder gleich dem zweiten) einen leeren String liefert, ergibt range eine leere Liste, falls das erste Argument größer oder gleich dem zweiten ist. In diesem Fall springt der Interpreter gleich zu Zeile 15.
Nach der Funktion zum Berechnen der Fakultät steht in den Zeilen 17 bis 26 eine Testfunktion. Üblicherweise bedeutet ein führender Unterstrich in einem Bezeichner, das dieser nur intern (hier in dem Modul) zum Einsatz kommt.
In den Zeilen 28 bis 32 steht etwas Testcode. Dieser ruft die vorher definierte Testfunktion auf – aber nur, wenn Sie das Modul auf der Kommandozeile als Script ausführen. Sonst ignoriert der Interpreter der Code nach Zeile 28. In der if-Bedingung ist __name__ der Name des Moduls, der bei Ausführung von der Kommandozeile der String '__main__' ist, sonst der Name des Moduls. Dieses Idiom finden Sie in Python-Modulen sehr häufig.
Das Modul fakultaet verwenden Sie in eigenem Code so:
import fakultaet # gibt 720 aus print fakultaet.fakultaet(6)
Mit der import-Anweisung laden Sie das Modul. Danach stehen über den Modulnamen alle Bezeichner im importierten Modul zur Verfügung; in fakultaet.fakultaet(6) steht der erste Bezeichner für das Modul, der zweite für die Funktion darin. Der Punkt dazwischen heißt Attributzugriffs-Operator, weil Sie damit auf das rechts davon stehende Attribut (hier die Funktion) des links davon stehenden Objekts (hier das Modul) zugreifen.
Das links vom Punkt stehende Objekt heißt auch Namensraum, weil Sie von dort aus auf die darin definierten Namen zugreifen. Wahrscheinlich haben Sie sich gefragt, ob Sie nicht die Funktion verwenden können, ohne das Modul davor zu schreiben. Das geht mit der Form from modul import name, also im Beispiel
from fakultaet import fakultaet print fakultaet(6)
Benötigen Sie nur wenige Namen, ist der gesparte Schreibaufwand unwichtig; benötigt man viele Namen aus Modulen, ist die ursprünglich vorgestellte Variante beim Lesen des Codes verständlicher. Kurzum: Verwenden Sie lieber nur die Form import Modul
(oder from Paket
import Modul
, siehe unten).
Die Standard-Distribution
Ein Motto im Zusammenhang mit Python lautet "Batteries included" und meint die Auswahl hunderter nützlicher Module, die mit der Standard-Distribution mitkommen. Tabelle 2 listet einige gebräuchliche Module auf. Unter [5] finden Sie alle Module der Distribution auf einen Blick; die Python Library Reference [6] gliedert die Module nach Themen.
Einige Module der Standard-Distribution
| Modul | Beschreibung |
|---|---|
cgi
|
CGI-Support (es gibt außerdem zahlreiche Web-Frameworks [7]) |
cgitb
|
ausführliche Fehlermeldungen für die CGI-Entwicklung |
ConfigParser
|
Parser für Konfigurationsdateien |
csv
|
Unterstützung kommaseparierter (CSV) Dateien |
datetime
|
Datentypen und Arithmetik für Datum und Uhrzeit |
distutils
|
Werkzeuge zum Erstellen und Installieren von Python-Paketen |
doctest
|
automatisierte Tests in Docstrings, tolles Konzept! |
email
|
Parsen und Erstellen von E-Mails, auch mit Anhängen |
ftplib
|
FTP-Client-Bibliothek (einfacher geht's mit ftputil [8]) |
gettext
|
Schnittstelle zu GNU gettext |
glob
|
plattformübergreifende Wildcard-Unterstützung |
gzip
|
Lesen und Schreiben von gzip-Dateien |
hotshot
|
Profiler (Geschwindigkeitsanalysator) für Python-Code |
imaplib
|
IMAP-Client-Bibliothek |
inspect
|
zahlreiche Informationen über Python-Objekte während der Programmlaufzeit ermitteln |
logging
|
Logdateien schreiben |
mailbox
|
Parsen von Mailbox-Dateien |
math
|
mathematische Funktionen |
nntplib
|
NNTP (Usenet)-Client-Bibliothek |
optparse
|
vielseitige Unterstützung für Kommandozeilen-Schnittstellen |
os
|
verschiedene Betriebssystem-Schnittstellen (Dateien und Verzeichnisse und Prozesse) |
os.path
|
Bearbeiten von Pfadnamen, Dateieigenschaften ermitteln; wird durch import os automatisch mit importiert
|
pdb
|
Python-Debugger |
pickle
|
Python-Objekte in Strings wandeln und umgekehrt |
poplib
|
POP3-Client-Bibliothek |
pprint
|
übersichtliche Darstellung von Datenstrukturen |
pydoc
|
Dokumentation zu Python-Objekten extrahieren |
re
|
reguläre Ausdrücke |
shutil
|
Dateioperationen (kopieren, verschieben usw.) |
smtplib
|
SMTP-Client-Bibliothek |
StringIO
|
Datei-Schnittstelle für Strings |
sys
|
Schnittstellen zum Python-Interpreter |
tarfile
|
tar-Dateien lesen und schreiben |
threading
|
Multithreading-Unterstützung |
time
|
Datums-/Zeit-Operationen (vgl. datetime)
|
urllib, urllib2
|
verallgemeinerter Zugriff auf URLs |
xml.dom
|
DOM-API für XML |
xml.sax
|
SAX-API für XML |
zipfile
|
Lesen und Schreiben von Zip-Dateien |
zlib
|
Komprimieren und Entpacken mit dem zlib-Algorithmus (vgl. gzip)
|



