0%

Programma’s die argumenten accepteren · oefening

Eén gevalideerde optie toevoegen

Positionele paden bepalen welke bestanden je gebruikt. De overgebleven interfacekeuze is optioneel: alleen items behouden waarvan de hoeveelheid de drempel van de aanroeper haalt.

Valideer voordat de conversie begint

argparse kan voor een optiewaarde een conversiefunctie aanroepen. Schrijf er een die een niet-negatieve integer teruggeeft of het eigen fouttype van de parser opwerpt:

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

Deze fout hoort bij de grammatica van de interface, niet bij de catalogusgegevens. Argparse gebruikt de melding van ArgumentTypeError als uitleg, toont gebruiksinformatie op stderr en eindigt met status 2 voordat het invoerbestand wordt geopend. Het vangt ook een gewone ValueError op, maar vervangt de melding daarvan door een algemene uitleg over een ongeldige waarde. Gebruik ArgumentTypeError als je wilt dat de aanroeper jouw specifieke regel ziet.

Voeg de optie toe aan 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)",
)

De standaardwaarde behoudt de eerdere converter: de optie weglaten behoudt elk geldig item.

Filter waarden, geen bestanden

Voeg select_items(items, minimum_quantity) toe. Doorloop de al genormaliseerde itemdictionaries, voeg een item toe als item["quantity"] >= minimum_quantity en geef de nieuwe lijst terug. Verwerk de CSV niet opnieuw, sorteer niet en verwijder geen duplicaten.

Verander convert_catalog zodat die minimum_quantity=0 accepteert, na read_catalog_csv selecteert en de geselecteerde lijst via dezelfde gevalideerde JSON-schrijffunctie opslaat. Geef ten slotte args.minimum_quantity door vanuit main.

Drie dingen zijn het waard om met de hand te controleren. Voer uit met --minimum-quantity 0 en controleer of je elk item krijgt, zodat de standaardwaarde echt niets wegfiltert. Voer uit met een drempel die alles uitsluit en controleer of je een lege itemlijst krijgt in plaats van een crash. Zet daarna wat tekst in het uitvoerbestand, voer uit met --minimum-quantity -1 en controleer of je tekst er nog staat: argparse hoort de opdracht te hebben afgewezen voordat iets dat bestand opende.

Waarom werp je in de optieconverter argparse.ArgumentTypeError op in plaats van ValueError?

Waarom heeft --minimum-quantity standaard de waarde 0?

Opdracht

Voeg de ene afgesproken catalogusoptie toe.

  • Definieer non_negative_int(text) zodat niet-gehele getallen en negatieve integers een argparse.ArgumentTypeError("must be a non-negative integer") opwerpen.

  • Voeg --minimum-quantity COUNT toe met dat type, standaardwaarde 0 en de afgesproken hulptekst.

  • Definieer select_items(items, minimum_quantity) en behoud de invoervolgorde en duplicaten terwijl je hoeveelheden groter dan of gelijk aan de drempel behoudt.

  • Geef convert_catalog een parameter minimum_quantity met een standaardwaarde, selecteer de genormaliseerde items en schrijf alleen dat resultaat.

  • Geef de verwerkte optie door vanuit main.

Verplaats het verwerken van CSV, schrijven van JSON of valideren van het schema niet naar de parser.