← Python/Eindproject: Urenrapport
Les 7 van 8
MODULE 14 · 07◷ 35 min

Een CLI met echte argumenten, uitvoer en foutstatus

Na deze les kun je
  • Posities en opties naar de bestaande projectfuncties vertalen.
  • Succes en verwachte fouten via de juiste status en stream melden.
  • Importeren scheiden van starten en onverwachte fouten laten doorgaan.

De afzonderlijke projectmodules kunnen lezen, rekenen en publiceren. Een command-line-interface verbindt die mogelijkheden met wat een gebruiker kiest. Zij moet duidelijke argumenten aannemen en pas na een geslaagde publicatie melden dat het rapport er is.

De opdracht begint met expliciete keuzes

Onze CLI heet urenrapport. De twee verplichte posities zijn de invoerbron en de rapportnaam. Opties kiezen de uitvoermap, JSON of CSV en eventueel een begin- of einddatum.

Een parser kan een gekozen argumentenlijst lezen
import argparse

parser = argparse.ArgumentParser(prog='voorbeeld', allow_abbrev=False)
parser.add_argument('source')
parser.add_argument('--format', choices=['json', 'csv'], default='json')
args = parser.parse_args(['registraties.csv', '--format', 'csv'])
print(args.source)
print(args.format)
Verwachte uitvoer
registraties.csv
csv

Het voorbeeld geeft een lijst expliciet aan parse_args. Dat maakt dezelfde parser bruikbaar in een directe proef, zonder de echte sys.argv van het omringende programma te veranderen. Wanneer main geen argv ontvangt, mag argparse juist de echte programmaregel gebruiken.

De optie allow_abbrev=False houdt de afgesproken optienamen volledig. Een kort stukje zoals --sta wordt niet ongemerkt een geldige nieuwe schrijfwijze van --start. De choices bij --format beperken de toegestane keuzen meteen.

Vertalen aan de ingang, daarna doorgeven

Een argument uit argparse is eerst tekst. Zet aanwezige datumopties met parse_day om naar de interne kalenderdatum. Een niet gekozen grens blijft None.

Daarna roept de CLI de regiefunctie aan. Die functie verbindt de bestaande lees-, reken- en uitvoermodule al. De CLI gaat de bron niet opnieuw lezen en berekent de teamtotalen niet nogmaals uit de ontvangen uitvoertekst.

De optionele keywordafhankelijkheid run gebruikt normaal run_report. Een test kan daar een gecontroleerde foutgevende functie invullen om precies de grensafhandeling te bekijken. Dat vervangt niet de echte I/O-proeven uit de vorige lessen.

Succes heeft een moment en een status

De regie levert een bestemming en rapport terug nadat publiceren geslaagd is. Gebruik die echte gegevens voor de korte succesmelding. Een vaste melding met de demo-aantallen zou bij een andere bron onjuist zijn.

De functie main geeft bij succes het gehele getal nul terug. Het meegeleverde hours.__main__ vertaalt die waarde met SystemExit naar de programmastatus wanneer het pakket met python -m hours wordt gestart. De status is daardoor ook bruikbaar voor een ander programma dat onze CLI aanroept.

Een argumentenfout is al van de parser

Argparse meldt een ontbrekend argument zelf
main.py
import argparse

parser = argparse.ArgumentParser(prog='voorbeeld', allow_abbrev=False)
parser.add_argument('source')
parser.parse_args([])
Verwachte fout
the following arguments are required: source

Het voorbeeld stopt met status twee en een echte gebruiksmelding op stderr. Argparse verzorgt dat gedrag voor ontbrekende posities of ongeldige opties. Je hoeft er geen tweede zelfgeschreven parser of vaste fouttekst naast te zetten.

Projectfouten ontstaan pas wanneer datums worden omgezet of de opdracht wordt uitgevoerd. Voor InputError, OSError en UnicodeError print onze CLI een melding die met Fout: begint op stderr en geeft zij twee terug. Zo blijven normale uitvoer en een probleemmelding afzonderlijk bruikbaar.

Veelgemaakte fout: iedere uitzondering als invoerfout melden

Een brede except kan ook een programmeerfout verbergen, zoals het verkeerd aanroepen van een functie. Die fout wordt dan ten onrechte gepresenteerd alsof de gebruiker zijn CSV moet aanpassen. Vang daarom alleen de afgesproken foutfamilies; andere fouten en onderbrekingen blijven hun eigen object en betekenis houden.

Importeren is geen gebruikersopdracht

Een test of ander onderdeel mag hours.cli importeren zonder meteen een bestand te verwerken. De startactie staat daarom in hours.__main__, apart van de functiedefinities. Importeren geeft geen succesmelding en maakt geen rapport.

Met die scheiding kunnen de volgende regressieproeven de complete opdracht direct aanroepen. Zij hoeven geen proces of netwerkverbinding na te bootsen. De echte bron, het rapport en de foutstatus blijven controleerbaar.

AAN DE SLAG 0/4
1

Van argumenten naar een echte opdracht

Maak main(argv=None, *, run=run_report). Gebruik ArgumentParser(prog="urenrapport", allow_abbrev=False), twee posities source/name, --root standaard".", --format met json/csv standaardjson en optionele --start/--end. Parse de werkelijk meegegeven argv. Vertaal aanwezige datums met parse_day en roep run met source, root, name, formaat en start/end als keywords aan.

2

Een gekozen resultaat als succes melden

Na geslaagde publicatie print je precies "Rapport geschreven: <naam> (<aantal> registraties, <minuten> minuten)." op stdout en geef je int0 terug. Gebruik de echte bestemming en rapportwaarden; --format en beide inclusieve periodegrenzen blijven betekenis houden.

3

Argumentenfouten en verwachte projectfouten

Laat argparse voor ontbrekende/verkeerde argumenten status2 en zijn gebruikstekst verzorgen. Vang alleen InputError, OSError en UnicodeError rond datumomzetting en uitvoering: print "Fout: <melding>" op stderr en geef int2 terug. Geen succesmelding of gewijzigd oud rapport bij deze fouten.

4

Importeren blijft zonder opdracht en bugs blijven bugs

Importeren van hours.cli start geen opdracht en maakt geen rapport. Het meegeleverde hours.__main__ roept main aan bij python -m hours. De keywordafhankelijkheid run blijft vervangbaar voor een test. Onverwachte exceptions en onderbrekingen gaan als hetzelfde object door; verpak ze niet als gewone invoerfouten.

Samenvatting

  • Argparse verwerkt de gekozen argumenten; de regiefunctie doet de echte opdracht.
  • Een succesmelding volgt op geslaagde publicatie en status nul.
  • Verwachte fouten gaan naar stderr met status twee; importeren start niets.
hours/cli.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.