Python-Kurs / Eigenen Code in Module aufteilen und mit import wiederverwenden
Ein Modul ist eine wiederverwendbare Einheit Python-Code, die häufig als einzelne .py-Datei beginnt. import sucht und initialisiert das Modul und bindet einen Namen daran; es kopiert nicht einfach seinen Quelltext in die aufrufende Datei.
Berechnung und Anwendung auf zwei Dateien verteilen
Die Berechnungsfunktion gehört hier in expense_math.py, der aufrufende Programmteil in app.py. Speichern Sie beide Dateien im selben neuen Übungsordner. So lässt sich dieselbe Berechnung von mehreren Anwendungen verwenden, ohne den Funktionskörper mehrfach einzufügen. app.py bestimmt, welche Werte berechnet und angezeigt werden.
Verwenden Sie für solche Modulnamen Unterstriche statt Bindestrichen. Nennen Sie eigene Dateien nicht wie benötigte Standardmodule, beispielsweise json.py oder csv.py. Eine lokale Datei kann sonst beim Suchen vor dem gewünschten Bibliotheksmodul gefunden werden. Die Python-Einführung zu Modulen erläutert sowohl Wiederverwendung als auch den Suchpfad.
import expense_math bindet den Modulnamen; die Funktion wird als expense_math.total angesprochen. from expense_math import total bindet dagegen direkt den Namen total, ohne damit zusätzlich expense_math im aufrufenden Namensraum anzulegen. Die ausdrückliche Modulschreibweise macht die Herkunft sichtbar und verringert Verwechslungen mit gleich benannten Funktionen.
Beide vollständigen Dateien speichern und starten
Erstellen Sie zuerst expense_math.py mit folgendem vollständigem UTF-8-Inhalt:
def total(amounts):
return sum(amounts)
Erstellen Sie daneben app.py mit diesem vollständigem Inhalt:
import expense_math
print(expense_math.total([3500, 8000, 2500]))
Öffnen Sie das Terminal im Ordner mit beiden Dateien, wählen Sie Ihren Projektinterpreter und führen Sie aus:
python app.py
Es erscheint 14000, die Summe aus 3500, 8000 und 2500. Zusatzpakete werden nicht benötigt. Unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 app.py der passende Aufruf sein. Kontrollieren Sie bei versteckten Dateiendungen, dass die Dateien tatsächlich auf .py und nicht auf .py.txt enden.
Das folgende allgemeine Schema veranschaulicht nur eine Hauptdatei und einen Helfer:
practice/
main.py
helper.py
Für diese konkrete Übung behalten Sie die tatsächlichen Namen app.py und expense_math.py bei. Sie müssen nicht zusätzlich main.py und helper.py anlegen.
Suchpfad, erste Initialisierung und Cache verstehen
Bei einer gewöhnlichen Skriptausführung ist das Verzeichnis des gestarteten Skripts Teil des Suchpfads. Deshalb können nebeneinanderliegende Dateien auch dann zusammenarbeiten, wenn Sie das Skript aus einem anderen Arbeitsordner mit seinem vollständigen Pfad starten. Bei einer interaktiven Sitzung oder python -c ist die Ausgangssituation anders: Dort spielt der aktuelle Arbeitsordner eine unmittelbare Rolle. Ein Fehler in einem anderen Startmodus beweist daher nicht, dass die beiden Dateien falsch sind.
Bei ModuleNotFoundError prüfen Sie nacheinander den exakt geschriebenen Modulnamen, den Speicherort der Datei, die Dateiendung und den verwendeten Interpreter. sys.executable zeigt in einer Python-Sitzung dessen Pfad; expense_math.__file__ zeigt nach erfolgreichem Import die tatsächlich gefundene Datei. Kopieren Sie den Helfer nicht vorschnell in globale Installationsordner und fügen Sie keine beliebigen Verzeichnisse zu sys.path hinzu. Halten Sie zunächst Dateiaufbau und Startart zusammenpassend.
Beim ersten Import werden die Anweisungen auf Modulebene ausgeführt. Eine dort ergänzte Zeile print("expense_math loaded") erscheint deshalb bereits durch das Importieren. Zwei aufeinanderfolgende import expense_math im selben gewöhnlichen Prozess verwenden danach normalerweise das vorhandene Modul. Eine erneute Ausführung in einem frischen Python-Prozess initialisiert es wieder. Der Cache gehört zur laufenden Sitzung, nicht zu allen zukünftigen Starts; die Referenz zum Modulcache beschreibt diese Wiederverwendung.
Eine Funktionsdefinition auf Modulebene legt die Funktion an, ruft ihren Körper aber nicht auf. Unbedingt ausgeführte Eingabeaufforderungen, Dateiänderungen oder andere Arbeiten auf dieser Ebene würden dagegen schon durch einen Import starten. Definieren Sie wiederverwendbare Aufgaben als Funktionen und lassen Sie die Anwendung ausdrücklich entscheiden, wann sie aufgerufen werden. Nach Änderungen starten Sie für diese Übung den Prozess neu, damit kein früher importiertes Modul weiterverwendet wird.
Wiederverwendung und typische Importfehler prüfen
- Ändern Sie nur den Betrag 3500 in
app.pyzu 4500. Dieselbe unveränderte Funktion muss nun 15000 liefern. Stellen Sie anschließend 3500 wieder her. - Ergänzen Sie vorübergehend
print("expense_math loaded")außerhalb der Funktionsdefinition im Helfer. Starten Sie die Anwendung frisch: Die zusätzliche Meldung steht vor 14000. Entfernen Sie die Meldung wieder. - Importieren Sie den mit der Meldung versehenen Helfer zweimal in einer einzelnen Sitzung. Die Meldung erscheint normalerweise nur beim ersten Import. Beenden Sie diese Sitzung und prüfen Sie Änderungen in einem frischen Prozess.
- Falls die falsche Datei gefunden wird, prüfen Sie deren
__file__und benennen Sie die kollidierende eigene Datei in einen eindeutigen Namen um. Beenden Sie den alten Prozess, korrigieren Sie die eigenen Importstellen und starten Sie neu. Ändern Sie dafür keine Datei der Standardbibliothek.
Wenn zwei Module sich gegenseitig importieren und dabei einen noch nicht angelegten Namen benötigen, kann die Initialisierung an einem teilweise geladenen Modul scheitern. Entfernen Sie die gegenseitige Abhängigkeit, indem Sie beispielsweise gemeinsam benötigte Berechnungen in ein drittes Modul auslagern. Eine klare Richtung von der Anwendung zur Berechnung ist leichter nachzuvollziehen als zwei Dateien, die beim Laden bereits aufeinander angewiesen sind.




