0%

Ein Programm über mehrere Dateien organisieren · Übung

Einen Programmeinstieg wählen

Das Projekt hat jetzt drei Dateien. Zwei davon sind Module, die Dinge definieren und sonst nichts tun. Eine ist anders.

main.py ist der Programmeinstieg: die Datei, die du zum Starten ausführst. Dieses Projekt hat einen Einstieg mit einer Aufgabe, die die anderen Dateien nicht haben. Größere Projekte können mehrere Einstiege für verschiedene Verwendungen anbieten.

Wozu ein Programmeinstieg dient

Ein Einstieg beantwortet eine Frage: Was geschieht tatsächlich, wenn dieses Programm läuft?

Alles andere im Projekt ist eine Fähigkeit. models.py beschreibt, was eine Frage ist. scoring.py kann einen Punktestand in einen Buchstaben umwandeln. Keines entscheidet über den Ablauf. Im Einstieg stehen die Entscheidungen: welches Quiz, welche Person, was ausgegeben wird und in welcher Reihenfolge.

Damit ist er die spezifischste und am wenigsten wiederverwendbare Datei des Projekts. Genau so soll es sein. Deshalb sollte sie auch kurz sein. Bei zwanzig Zeilen main.py kannst du lesen und verstehen, was das Programm tut. Bei zweihundert versteckt sich seine Form zwischen den Einzelheiten.

Die Form

Try it

Drei Dinge in dieser Reihenfolge:

  1. Importe, die sagen, woraus das Programm aufgebaut ist.

  2. Eine Funktion main(), die die Teile verbindet.

  3. Die Schutzabfrage, die main() nur beim direkten Start dieser Datei aufruft.

Die Arbeit in main() statt auf oberster Ebene unterzubringen lohnt sich, obwohl die Schutzabfrage allein die Ausführung beim Import verhindern würde. Eine Funktion lässt sich aus einem Test aufrufen, zweimal aufrufen oder später mit anderen Argumenten aufrufen. Code auf oberster Ebene kann nur einmal auf eine Weise stattfinden.

Warum die Verbindung der Teile in main() statt direkt unter if __name__ == "__main__": schreiben?

Welche Datei __main__ ist

Nur eine Datei eines Programmlaufs ist __main__: die gestartete. Jede andere Datei hat ihren eigenen Modulnamen, unabhängig davon, wie sie importiert wurde.

Das hat eine praktische Folge. Hätte models.py am Ende eine geschützte Demo, würde ein Start von main.py sie nicht auslösen, denn models ist in diesem Lauf nicht __main__. Ein direkter Start von models.py würde sie auslösen. Jede Datei kann eine eigene Demo haben, ohne die anderen zu stören.

Ein Projekt vom Einstieg aus lesen

Ist ein Projekt so aufgebaut, verstehst du es am schnellsten, indem du den Einstieg öffnest und seine Importe liest.

from models import Attempt, Question, Quiz
from report import report_lines
from scoring import grade_letter, percentage

Drei Zeilen, und du weißt schon vor der ersten Funktion, dass das Programm eine Domäne, eine Berichtsschicht und Bewertungsregeln hat. Das ist der Gewinn dieses Kapitels: Die Struktur ist Dokumentation, die nicht veralten kann, weil sie die Sache selbst ist.

Die Übung

main.py wird zu einem richtigen Programmeinstieg. Es erhält das Bewertungsmodul und behält nur, was zum Ausführen des Programms gehört.

Aufgabe

Mache main.py zu einem richtigen Programmeinstieg.

Importiere das Benötigte: Attempt, Question und Quiz aus models sowie grade_letter und percentage aus scoring.

Behalte build_quiz() und report_lines(attempt) vorerst hier. Die nächste Lektion gibt dem Bericht einen eigenen Ort. Erweitere report_lines um eine zweite zurückgegebene Zeile "Grade: <letter>". Verwende die beiden Bewertungsfunktionen, statt selbst zu rechnen.

main() verbindet die Teile und übernimmt die Ausgabe. Nichts anderes in der Datei darf beim Import Arbeit ausführen. Die Datei endet mit der Schutzabfrage.

Beim Ausführen sollen die Zeile mit dem Punktestand und die Zeile mit der Note erscheinen.