20.2 Lokale Module 

Nachdem Sie die import-Anweisung kennengelernt haben, möchten wir uns damit beschäftigen, wie lokale Module selbst erstellt und eingebunden werden können. Beachten Sie, dass es sich hier nicht um ein globales Modul handelt, das in jedem Python-Programm zur Verfügung steht, sondern um ein Modul, das nur lokal in Ihrem Python-Programm genutzt werden kann. Von der Verwendung her unterscheiden sich lokale und globale Module kaum. In diesem Abschnitt soll ein Programm erstellt werden, das eine ganze Zahl einliest, deren Fakultät und Kehrwert berechnet und die Ergebnisse ausgibt. Die mathematischen Berechnungen sollen dabei nicht nur in Funktionen, sondern auch in einem eigenen Modul gekapselt werden. Dazu schreiben wir diese zunächst in eine Datei namens mathehelfer.py:
def fak(n):
ergebnis = 1
for i in range(2, n+1):
ergebnis *= i
return ergebnis
def kehr(n):
return 1 / n
Die Funktionen sollten selbsterklärend sein. Die Datei mathehelfer.py erzeugt nur die Funktionen fak und kehr, die aus anderen Modulen heraus aufgerufen werden können.
Jetzt erstellen wir eine Programmdatei namens programm.py, in der das Hauptprogramm stehen soll. Beide Dateien müssen sich im selben Verzeichnis befinden. Im Hauptprogramm importieren wir zunächst das lokale Modul mathehelfer. Der Modulname eines lokalen Moduls entspricht dem Dateinamen der zugehörigen Programmdatei ohne Dateiendung. Der Modulname muss den Regeln der Namensgebung eines Bezeichners folgen. Das bedeutet insbesondere, dass kein Punkt im Dateinamen erlaubt ist, abgesehen von dem Punkt vor der Dateiendung.
>>> import mathehelfer
>>> print("Fakultät:", mathehelfer.fak(5))
Fakultät: 120
>>> print("Kehrwert:", mathehelfer.kehr(5))
Kehrwert: 0.2
Sie sehen, dass Sie das lokale Modul im Hauptprogramm wie ein globales Modul importieren und verwenden können.
[»] Hinweis
Beim Einbinden eines Moduls wird auch unter Windows zwischen Groß- und Kleinschreibung unterschieden. Ein Modul namens ABC.py können Sie also mit der Anweisung import abc nicht einbinden. Stattdessen schreiben Sie import ABC.
20.2.1 Namenskonflikte 

Durch das Erstellen eigener Module kann es leicht zu Namenskonflikten mit globalen Modulen kommen. Beispielsweise hätten wir unsere oben verwendete Programmdatei auch math.py und das Modul demzufolge math nennen können. Dieses Modul stünde im Konflikt mit dem Modul math der Standardbibliothek. Für solche Fälle ist dem Interpreter eine Reihenfolge vorgegeben, nach der er zu verfahren hat, wenn ein Modul importiert werden soll:
- Zunächst wird der lokale Programmordner nach einer Datei mit dem entsprechenden Namen durchsucht. In dem oben geschilderten Konfliktfall stünde bereits im ersten Schritt fest, dass ein lokales Modul namens math existiert. Wenn ein solches lokales Modul existiert, wird dieses eingebunden und keine weitere Suche durchgeführt.
- Wenn kein lokales Modul des angegebenen Namens gefunden wurde, wird die Suche auf globale Module ausgeweitet.
-
Wenn auch kein globales Modul mit dem angegebenen Namen gefunden wurde, wird ein ModuleNotFoundError erzeugt:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named bla
20.2.2 Modulinterne Referenzen 

In jedem Modul existieren Referenzen, die Informationen über das Modul selbst enthalten. Diese werden in Tabelle 20.1 zusammengefasst. Beachten Sie, dass es sich jeweils um zwei Unterstriche vor und hinter dem Namen der Referenz handelt.
Referenz | Beschreibung |
---|---|
__builtins__ | ein Dictionary, das die Namen aller eingebauten Typen und Funktionen als Schlüssel und die mit den Namen verknüpften Instanzen als Werte enthält |
__file__ | ein String, der den Namen der Programmdatei des Moduls inklusive Pfad enthält; nicht bei Modulen der Standardbibliothek verfügbar |
__name__ | ein String, der den Namen des Moduls enthält |
Tabelle 20.1 Globale Variablen in einem Modul
20.2.3 Module ausführen 

Wird das Modul über eine import-Anweisung eingebunden, wird der in ihm enthaltene Code ausgeführt. Das betrifft zum Beispiel Definitionen von Funktionen oder Klassen, die danach im resultierenden Namensraum enthalten sind. Ein Modul unterscheidet sich jedoch prinzipiell nicht von einem normalen Python-Programm. Es ist insbesondere nicht auf Funktions- oder Klassendeklarationen eingeschränkt, sondern kann beliebigen Code enthalten. Auch dieser Code wird beim Einbinden des Moduls ausgeführt. Umgekehrt muss ein Modul nicht zwangsweise eingebunden werden, sondern kann über den Python-Interpreter auch direkt ausgeführt werden. Kurz: Der Unterschied zwischen einem Programm und einem Modul besteht nur darin, auf welchem Wege es ausgeführt wird.
Ob eine Programmdatei als Programm oder als Modul ausgeführt wird, können Sie anhand des Wertes von __name__ erkennen. Bei einem eingebundenen Modul referenziert __name__ den Modulnamen, bei einem ausgeführten Programm den String "__main__". Das ermöglicht es, darauf zu reagieren, wenn ein Modul direkt ausgeführt wird:
if __name__ == "__main__":
print("Dies ist ein Modul und sollte eingebunden werden.")