Modularisierung mit Paketen

Pakete

Paket Beim Verfassen sprachlicher Dokumente steht natürlich der Inhalt selbst im Vordergrund, aber man wird wohl kaum diesen Inhalt an seine Leserinnen und Leser bringen können, wenn dieser Inhalt nicht gegliedert ist. Man gliedert in Bücher, Kapitel, Unterkapitel, Abschnitte und so weiter.
Ähnliches gilt natürlich auch für Python-Programme. Werden Sie nicht ordentlich gegliedert, d.h. modularisiert, wird es schwer sie zu verstehen und zu warten. Im vorigen Kapitel hatten wir Module kennengelernt, die sich hervorragend eignen, Programme zu strukturieren bzw. zu modularisieren. Was aber, wenn die Zahl unserer Module wächst, wenn wir die Übersicht über unsere Module verlieren könnten? Für diesen Fall hat Python das Paketkonzept. Wir können mehrere oder beliebig viele Module zu einem Paket ,,schnüren''. Der dazu erforderliche Mechanismus ist wiederum denkbar einfach in Python gelöst.


Einfaches Paket unter Python Um ein Paket in Python zu erstellen, sind nur zwei Dinge zu tun: Man erzeugt einen Unterordner in einem Verzeichnis, in dem Python Module erwartet bzw. sucht. In diesem neu erzeugten Ordner muss man nun eine Datei mit dem Namen anlegen. Die Datei kann leer sein oder Initialisierungscode enthalten, der beim Einbinden des Paketes einmalig ausgeführt wird. Pakete können wiederum Pakete enthalten. Im folgenden zeigen wir nun anhand eines einfachen Beispieles, wie man ein Paket erzeugt. Unser Paket soll SimplePackage heißen. Dazu erzeugen wir einen Ordner\footnote{In Linux oder Unix können wir dies mit dem Befehl ,,mkdir SimplePackage'' tun} mit dem Namen SimplePackage. In diesem Ordner legen wir eine leere Datei mit dem Namen __init__.py an\footnote{In Linux kann man dies mit einem touch-Kommando am einfachsten tum: ,,touch __init.py__''}. Außderdem legen wir noch zwei einfache Module in diesem Verzeichnis an. Ein Modul namens ,,a.py'' mit dem folgenden Inhalt:

def f1():
    print("Hello, f1 from module 'a' calling")
Ein weiteres Modul mit dem Name ,,b.py'' und dem Inhalt:
def foo():
    print("Hello, foo from module 'b' calling")
Nun sind wir in der Lage unser Paket zu benutzen:
>>> from SimplePackage import a,b
>>> a.f1()
Hello, f1 from module 'a' calling
>>> b.foo()
Hello, foo from module 'b' calling
Versucht man das Paket SimplePackage direkt, also mittels ,,import SimplePackage'' zu importieren, erhält man eine Fehlermeldung. Dies liegt daran, dass die Module in einem Paket nicht automatisch importiert werden:
>>> import SimplePackage
>>> SimplePackage.a.f1()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'module' object has no attribute 'a'
Jetzt kann man das Initialisierungsverhalten von __init__.py ideal einsetzen. Wir fügen in diese bisher leere Datei die Zeile ,,from SimplePackage import a, b'' ein und können nun obigen Versuch wiederholen.
>>> import SimplePackage
>>> SimplePackage.a.f1()
Hello, f1 from module 'a' calling
Wie wir gesehen haben, erhalten wir keine Fehlermeldung und können auch auf die Module wie gewünscht zugreifen: