mitmario.dev

Eigene Module

Python Sandbox 3 Min Lesezeit 3 BeispieleLektion 3 von 7

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

Ein eigenes Modul
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

Probeaufrufe, die nur beim Start laufen
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

Eine Datei namens random.py
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, kostenlos

Zu 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.