0%

Programma’s die argumenten accepteren · oefening

De twee paden verwerken

De converter weet al hoe je catalogusgegevens leest, valideert en schrijft. Een opdrachtregelparser hoort dat werk niet te herhalen. Zijn taak is kleiner: argumenttekst omzetten in de waarden die main aan de converter doorgeeft.

argparse hoort bij de standaardbibliotheek van Python. Je hoeft niets te installeren.

Bouw één parser op één plek

Voeg de import toe en een functie waarvan de enige taak is de interface te beschrijven:

import argparse


def build_parser():
    parser = argparse.ArgumentParser(
        description="Convert a catalog CSV file to validated JSON.",
        allow_abbrev=False,
    )
    parser.add_argument("input_path", help="CSV catalog to read")
    parser.add_argument("output_path", help="JSON catalog to write")
    return parser

De argumentnamen worden attributen. Het verwerken van ["source.csv", "result.json"] geeft een namespace terug waarvan input_path "source.csv" is en output_path "result.json". Het blijven strings, die de bestandsfuncties uit hoofdstuk 7 al accepteren.

ArgumentParser voegt ook -h en --help toe. Omdat dezelfde declaraties zowel het parsen als de door de parser gemaakte hulp aansturen, blijven die twee bij elkaar passen wanneer de interface verandert.

allow_abbrev=False houdt de grammatica exact. Een beginstuk van een lange optie is geen geheime extra schrijfwijze: niet-gedeclareerde optienamen blijven parserfouten.

Geef tests en de shell hetzelfde startpunt

Verander de functiekop naar:

def main(argv=None):

Verwerk vervolgens de argumenten en geef de twee waarden door:

args = build_parser().parse_args(argv)
document = convert_catalog(args.input_path, args.output_path)

Wanneer argv None is, leest argparse de argumenten waarmee de shell het programma daadwerkelijk startte. Een aanroeper kan ook een lijst meegeven. Dat is geen achterdeur alleen voor tests; het is één interface met twee manieren om invoer te krijgen. Daardoor kan hoofdstuk 10 deze opdracht zonder shell testen.

Werk de succesmelding bij zodat die args.output_path gebruikt. Behoud voorlopig de bestaande gerichte afhandeling van catalogusfouten. De volgende lessen voegen de optie toe en zetten de fouttekst op de uiteindelijke stroom.

Toon voor jezelf aan dat de paden echt worden doorgegeven. Voer de opdracht uit met twee bestandsnamen die je nog niet hebt gebruikt en controleer of de uitvoer op de gevraagde plek staat, niet in catalog.json. Voer daarna uit met --help en met één ontbrekend pad, en lees wat argparse zelf doet.

Waarom accepteert main argv=None in plaats van altijd sys.argv te lezen?

Opdracht

Voeg de argparse-grens uit de standaardbibliotheek toe aan catalog.py.

  • Importeer argparse.

  • Definieer build_parser() met de afgesproken beschrijving en verplichte positionele argumenten input_path en output_path. Stel allow_abbrev=False in zodat niet-gedeclareerde schrijfwijzen van opties fouten blijven.

  • Verander main in main(argv=None) en verwerk de argumenten via build_parser().

  • Geef beide verwerkte paden door aan convert_catalog.

  • Behoud de gerichte tuple met catalogusfouten uit hoofdstuk 7, status 1 bij die fouten en status 0 bij succes.

  • Druk het werkelijk gevraagde uitvoerpad af in de succesregel.

Laat de exacte bewaking met raise SystemExit(main()) staan.