Abschnitt 10 · Lektion 3
Eigene Module
Wenn du ein paar Funktionen hast, die du immer wieder brauchst, kopierst du sie gern in jedes neue
Programm. Und Kopien laufen auseinander. Man verbessert die eine und vergisst die anderen. Besser
legt man sie einmal ab und holt sie mit import, so wie die Werkzeuge der Standardbibliothek. Auch
ein Programm über dreihundert Zeilen liest sich besser, wenn es auf ein paar Dateien mit je einem
Thema verteilt ist.
Jede Datei ist ein Modul
def linie(laenge):
return "-" * laenge
def ueberschrift(text):
return text + "\n" + linie(len(text)) import texte
print(texte.ueberschrift("Einkaufsliste"))
print("Brot")
print("Milch")
print(texte.linie(13)) Hier gibt es zwei Dateien. In texte.py stehen zwei Funktionen und sonst nichts. main.py ist das
Programm, das läuft. Mit import texte kommt die andere Datei in main.py dazu, mit genau
derselben Zeile wie bei import math.
Jede .py-Datei ist ein Modul. Ihr Name ohne .py ist der Modulname. Danach heißen die Funktionen
texte.ueberschrift und texte.linie.
Wie bei math geht auch from texte import linie, ueberschrift, und dann stehen beide ohne Punkt
da. Mehrere Namen werden mit einem Komma getrennt.
pruefen.py macht seit Lektion 8.2 nichts anderes. In den ersten Zeilen werden deine Funktionen aus
main.py geholt oder pruefe aus pruefhilfe.py, einem Modul, das im selben Ordner daneben liegt.
Probeaufrufe, die nur beim Start laufen
def linie(laenge):
return "-" * laenge
def ueberschrift(text):
return text + "\n" + linie(len(text))
if __name__ == "__main__":
print(ueberschrift("Probe"))
print(repr(linie(0))) from texte import linie, ueberschrift
print(ueberschrift("Einkaufsliste"))
print("Brot")
print("Milch")
print(linie(13)) Wenn man eine Funktion schreibt, will man sie meistens gleich ausprobieren. Also kommen zwei, drei
Aufrufe unten in die Datei, und dann python texte.py. Stehen diese Aufrufe einfach so da, laufen
sie bei jedem import texte mit, weil Python die Datei beim Importieren einmal von oben bis unten
ausführt. Das ist die Sache mit der Kaffeekasse aus Lektion 8.8, und die Lösung ist wieder dieselbe
Zeile, if __name__ == "__main__":.
Gestartet heißt die Datei __main__, importiert heißt sie texte. Was unter der Zeile steht, läuft
also nur, wenn man texte.py selbst startet. Bei main.py kommt deshalb nur die Einkaufsliste
heraus. Mit python texte.py in der Befehlsleiste kommen die Probeaufrufe und sonst nichts.
So ist ein Modul beides. Ein Werkzeug für andere Programme, und etwas, das man allein starten kann, um zu sehen, ob es noch tut, was es soll.
Auf deinem eigenen Rechner taucht nach dem ersten Import übrigens ein Ordner __pycache__ neben
deinen Dateien auf. Darin legt Python eine vorübersetzte Fassung des Moduls ab, damit der nächste
Start schneller geht. Löschen schadet nicht, der Ordner kommt von selbst wieder. Hier ist er
abgeschaltet, damit er nicht in jedem Dateibaum steht.
Wo Python sucht
print("Mein Würfelversuch") import random
print(random.randint(1, 6)) Python sucht ein Modul zuerst im Ordner der Datei, die gestartet wurde, und erst danach in der
Standardbibliothek. Deshalb wird texte.py ohne jede Angabe gefunden. Und deshalb geht das hier
schief.
Neben main.py liegt eine Datei random.py, ein alter Versuch mit dem Würfeln. Bei import random
wird zuerst diese Datei gefunden, ausgeführt (daher die Zeile Mein Würfelversuch) und als Modul
genommen. Eine Funktion randint gibt es darin nicht, und das Programm endet mit
AttributeError: module 'random' has no attribute 'randint'.
Seit Python 3.13 steht hinter der Meldung in Klammern ein Vorschlag mit dem vollen Pfad, die Datei
umzubenennen, weil sie so heißt wie ein Modul der Standardbibliothek. Bis Python 3.12 steht nur der
erste Teil da. Dann sitzt du vor einer Meldung, nach der es randint nicht gibt, obwohl es in jeder
Anleitung steht. So etwas kostet gern eine Stunde, weil man zuerst das richtige Modul verdächtigt
und nicht die eigene Datei.
Eigene Dateien heißen deshalb nie wie ein Modul, das man benutzen will. Also nicht random.py,
nicht csv.py und nicht statistics.py.
Was die Aufgabe will
Die zwei Funktionen für den Kassenbon, euro() und brutto(), liegen schon in einem eigenen Modul,
und dort sind sie besser geworden. In main.py stehen aber noch alte Kopien, und der Bon bricht ab.
Sobald die Kopien weg sind und die Funktionen aus dem Modul kommen, stimmt der Bon wieder.
Zum Mitnehmen
Jede eigene .py-Datei lässt sich importieren wie math. Nach import texte heißen die Funktionen aus texte.py zum Beispiel texte.linie(…). Weil Python zuerst im Ordner des gestarteten Programms sucht, darf keine eigene Datei so heißen wie ein Modul der Standardbibliothek, also auch nicht random.py oder csv.py.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.