0%

Programme, die Argumente annehmen · Übung

Eine validierte Option ergänzen

Positionspfade beantworten die Frage, welche Dateien verwendet werden. Die verbleibende Schnittstellenentscheidung ist optional: nur Artikel behalten, deren Menge den Schwellenwert des Aufrufers erreicht.

Vor dem Beginn der Konvertierung validieren

argparse kann für einen Optionswert eine Umwandlungsfunktion aufrufen. Schreibe eine, die entweder eine nicht negative ganze Zahl zurückgibt oder den eigenen Fehlertyp des Parsers auslöst:

def non_negative_int(text):
    try:
        value = int(text)
    except ValueError:
        raise argparse.ArgumentTypeError("must be a non-negative integer")
    if value < 0:
        raise argparse.ArgumentTypeError("must be a non-negative integer")
    return value

Dieser Fehler gehört zur Grammatik der Schnittstelle, nicht zu den Katalogdaten. Argparse verwendet die Meldung von ArgumentTypeError als Erklärung, zeigt den Aufrufhinweis auf stderr an und endet mit Status 2, bevor die Eingabedatei geöffnet wird. Es fängt auch einen einfachen ValueError ab, ersetzt dessen Meldung aber durch eine allgemeine Erklärung zum ungültigen Wert. Verwende ArgumentTypeError, wenn der Aufrufer deine konkrete Regel sehen soll.

Ergänze die Option in build_parser:

parser.add_argument(
    "--minimum-quantity",
    type=non_negative_int,
    default=0,
    metavar="COUNT",
    help="keep items whose quantity is at least COUNT (default: 0)",
)

Der Standardwert bewahrt den bisherigen Konverter: Ohne die Option bleibt jeder gültige Artikel erhalten.

Werte filtern, nicht Dateien

Ergänze select_items(items, minimum_quantity). Gehe die bereits normalisierten Artikel-Dictionarys durch, hänge einen Artikel an, wenn item["quantity"] >= minimum_quantity gilt, und gib die neue Liste zurück. Lies CSV nicht erneut ein, sortiere nicht und entferne keine Duplikate.

Ändere convert_catalog so, dass es minimum_quantity=0 akzeptiert, nach read_catalog_csv auswählt und die ausgewählte Liste über dieselbe validierte JSON-Schreibfunktion schreibt. Gib abschließend args.minimum_quantity aus main weiter.

Drei Dinge solltest du von Hand prüfen. Führe das Programm mit --minimum-quantity 0 aus und bestätige, dass du jeden Artikel erhältst, der Standardwert also tatsächlich nichts verändert. Verwende dann einen Schwellenwert, der alles ausschließt, und prüfe, ob du eine leere Artikelliste statt eines Absturzes erhältst. Schreibe schließlich etwas Text in die Ausgabedatei, führe das Programm mit --minimum-quantity -1 aus und prüfe, ob dein Text noch da ist: argparse sollte den Befehl abgelehnt haben, bevor irgendetwas diese Datei öffnet.

Warum sollte die Optionsumwandlung argparse.ArgumentTypeError statt ValueError auslösen?

Warum hat --minimum-quantity den Standardwert 0?

Aufgabe

Ergänze die eine festgelegte Katalogoption.

  • Definiere non_negative_int(text) so, dass Nicht-Ganzzahlen und negative ganze Zahlen argparse.ArgumentTypeError("must be a non-negative integer") auslösen.

  • Ergänze --minimum-quantity COUNT mit diesem Typ, dem Standardwert 0 und dem festgelegten Hilfetext.

  • Definiere select_items(items, minimum_quantity) und bewahre Eingabereihenfolge und Duplikate, während du Mengen größer oder gleich dem Schwellenwert behältst.

  • Gib convert_catalog einen Parameter minimum_quantity mit Standardwert, wähle die normalisierten Artikel aus und schreibe nur dieses Ergebnis.

  • Gib die eingelesene Option aus main weiter.

Verschiebe weder CSV-Einlesen noch JSON-Schreiben oder Schemavalidierung in den Parser.