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 Zahlenargparse.ArgumentTypeError("must be a non-negative integer")auslösen.Ergänze
--minimum-quantity COUNTmit diesem Typ, dem Standardwert0und 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_catalogeinen Parameterminimum_quantitymit Standardwert, wähle die normalisierten Artikel aus und schreibe nur dieses Ergebnis.Gib die eingelesene Option aus
mainweiter.
Verschiebe weder CSV-Einlesen noch JSON-Schreiben oder Schemavalidierung in den Parser.