Kapitel 8
Programme, die Argumente annehmen
Die Schnittstelle eines Programms ist ein Vertrag
Kapitel 7 endete mit einem echten Konverter, allerdings nur für die beiden Dateinamen, die in main() stehen. Eine Person kann keine andere Ein- oder Ausgabedatei wählen, ohne das Programm zu bearbeiten. Dieses Kapitel macht aus diesem festen Ablauf eine Kommandozeilenschnittstelle.
Die Shell selbst ist nicht erneut das Thema. Du weißt bereits, wie du in einem Projektstamm stehst und eine Python-Datei ausführst. Neu ist die Entscheidung, was das Programm akzeptiert und was jeder mögliche Lauf im Gegenzug verspricht.
Den Befehl vor dem Parser aufschreiben
Das ist die vollständige Schnittstelle, die wir bauen:
python catalog.py INPUT_PATH OUTPUT_PATH [--minimum-quantity COUNT]
INPUT_PATH und OUTPUT_PATH sind erforderliche Positionsargumente. Ihre Bedeutung ergibt sich aus ihrer Position: zuerst Eingabe, dann Ausgabe.
--minimum-quantity ist eine Option. Ihr Name macht die Bedeutung ihres Werts sichtbar. Wenn du sie weglässt, wird 0 verwendet. Die Anzahl muss eine ganze Zahl ab null sein. Das Programm behält Artikel, deren Menge mindestens dieser Anzahl entspricht, ohne sie umzuordnen oder Duplikate zu entfernen.
-h und --help zeigen die Schnittstelle an, ohne eine Konvertierung auszuführen.
Zwei Datenströme und drei Statuswerte
Ein Kommandozeilenprogramm hat zwei Textströme. Gewöhnliche Ergebnisse gehen an stdout. Fehler mit Hinweisen zur Behebung gehen an stderr. Die Trennung erlaubt einem anderen Werkzeug, das erfolgreiche Ergebnis zu speichern, ohne Fehlertext hineinzumischen.
Das Programm endet außerdem mit einem Exit-Status:
| Situation | stdout | stderr | Status |
|---|---|---|---|
| Konvertierung erfolgreich | Wrote N items to PATH. | leer | 0 |
| Eingabe oder Katalogdaten ungültig | leer | Could not convert catalog: ... | 1 |
| Argumente fehlen, sind unbekannt oder ungültig | leer | Aufrufhinweis und Parserfehler | 2 |
| Hilfe angefordert | Hilfetext | leer | 0 |
Die Ausgabedatei ist genauso genau festgelegt. Ein erfolgreicher Lauf schreibt validiertes UTF-8-JSON an den angeforderten Ausgabepfad. Ein Argumentfehler startet niemals eine Konvertierung. Ein unerwarteter Programmierfehler erhält weiterhin einen Traceback; er darf nicht als beschädigte Eingabe verkleidet werden.
Woher weiß das Programm beim Befehl python catalog.py source.csv result.json, welcher Pfad die Eingabe ist?
Warum gehört eine erwartete Meldung über einen fehlerhaften Katalog auf stderr?
Als Nächstes wandelt argparse die ersten beiden Teile dieses schriftlichen Vertrags in Werte um, ohne dass der Konverter CSV oder JSON neu lernen muss.
Beschreibe Monty vor dem Schreiben des Parsercodes deine Schnittstelle in einem Satz und frage, was einen Benutzer daran überraschen könnte. Schnittstellen lassen sich jetzt viel günstiger ändern als nach ihrer Umsetzung.