0%

Ein Programm über mehrere Dateien organisieren · Übung

Klassen klar importieren

models.py enthält Kopien von Question, Quiz und Attempt. main.py definiert noch die Originale. Schließe den Umzug ab, indem du diese doppelten Definitionen durch Importe ersetzt.

Die Verbindung braucht eine Zeile. Welche du wählst, ist eine kleine Entwurfsentscheidung, die du Hunderte Male treffen wirst.

Zwei Wege zu einem Namen

Try it

Steht die Klasse in einem Modul namens models, erreicht derselbe Code sie auf zwei Wegen:

import models

question = models.Question("Which keyword starts a function?", "def", 2)
from models import Question

question = Question("Which keyword starts a function?", "def", 2)

import models bindet das Modul ein und lässt dessen Namen hinter dem Modulnamen. from models import Question holt diesen einen Namen direkt in die aktuelle Datei.

main.py importiert Namen aus models.py und report.py und hält die Namensräume der Module klar getrennt.

Beides ist gewöhnlich und korrekt. Der Unterschied liegt darin, was Leser an der Verwendungsstelle sehen.

Zwischen beiden wählen

models.Question(...) sagt bei jeder Verwendung, woher die Klasse stammt. Das ist wertvoll, wenn ein Name allein mehrdeutig ist. Genau deshalb schreibt niemand from datetime import *.

Question(...) liest sich besser, wenn der Name eindeutig ist und häufig vorkommt. Zehn Aufrufe von models.Question hintereinander sind unnötiger Ballast. Ab dem zweiten sagt der Modulname nichts Neues mehr.

Diese Gewohnheit lohnt sich:

SituationBevorzuge
Wenige klar benannte Klassen, die du ständig verwendestfrom models import Question, Quiz
Ein Name, der allein wenig aussagt (load, run, parse)import loader, dann loader.load(...)
Zwei Module bieten denselben Namen anBeide mit import importieren und durch das Präfix unterscheiden

Für dieses Projekt passt from models import Attempt, Question, Quiz besser. Alle drei Namen sind konkret, und main.py verwendet sie wiederholt.

report.py und models.py definieren beide eine Funktion namens describe. Was sollte die Datei tun, die beide verwendet?

Wo Python sucht

from models import Question lässt Python nach models.py suchen. Zuerst sucht es im Verzeichnis des gestarteten Programms. Deshalb funktioniert der Import einer eigenen Datei neben main.py einfach, ohne Konfiguration.

Darum ist auch die Datei wichtig, von der aus das Programm startet. Das behandelt Lektion 5.

Eine Folge solltest du schon kennen: Eine eigene Datei namens random.py oder json.py würde vor dem entsprechenden Modul der Standardbibliothek gefunden. Jeder Import dieses Namens im Programm erhielte deine Datei. Der folgende Fehler ist verwirrend. Die Lösung ist, ein eigenes Modul nicht nach einem Modul der Standardbibliothek zu benennen.

Die Übung

main.py erhält seine Importzeile. Beachte, was dadurch geschieht: Das Programm behält sein Verhalten, verwendet die gemeinsamen Definitionen in models.py und sagt nun am Anfang genau, wovon es abhängt.

Aufgabe

Repariere main.py, die Datei im Editor dieser Lektion.

Importiere am Dateianfang Attempt, Question und Quiz aus models und lösche die drei Klassendefinitionen, die in der vorherigen Lektion dorthin gewandert sind. Alles andere bleibt: report_lines, build_quiz, main und die Schutzabfrage am Ende.

Verwende from models import Attempt, Question, Quiz. Alle drei Namen sind konkret und werden hier wiederholt verwendet. Dafür eignet sich dieser Stil.

Führe das Programm aus. Es soll exakt dasselbe ausgeben wie vor der Aufteilung. Genau darum geht es: Die Struktur hat sich geändert, das Verhalten nicht.