0%

Van werkende code naar programmaontwerp · oefening

De kosten van informele dictionaryvormen

Een dictionary accepteert bijna elke vorm, dus Python laat je elk van deze waarden maken:

good = {
    "prompt": "Two plus two?",
    "answer": "4",
    "points": 1,
}

missing_answer = {
    "prompt": "Three plus three?",
    "points": 1,
}

wrong_points = {
    "prompt": "Four plus four?",
    "answer": "8",
    "points": -5,
}

De dictionaries zijn geldige Python-waarden. Alleen de eerste is volgens de behoeften van ons programma een geldige quizvraag.

Dat verschil is belangrijk:

  • Python valideert de syntaxis van een dictionary.

  • Je programma moet de betekenis en de verwachte vorm valideren.

Maak records via één functie

Een aanmaakfunctie kan een betrouwbare vorm vastleggen:

def make_question(prompt, answer, points):
    return {
        "prompt": prompt,
        "answer": answer,
        "points": points,
    }

De functie wordt de normale route voor het maken van vragen. Ze kan ongeschikte waarden afwijzen voordat ze een slechts gedeeltelijk bruikbaar record teruggeeft.

Python-basis I introduceerde raise als de manier waarop een functie meldt dat ze geen normaal resultaat kan opleveren. Hier gebruikt de aanmaakfunctie hetzelfde hulpmiddel om de regels voor een geldige vraag te bewaken:

if not prompt.strip():
    raise ValueError("A question needs a prompt")

Na .strip() wordt een lege vraagtekst de lege string "". Je leerde in Python-basis I dat een lege string falsy is, dus maakt not de afwijzingsvoorwaarde waar.

Dit verbetert het ontwerp met behoud van bekende dictionaries. Elk deel van het programma kan vraagrecords ontvangen met dezelfde sleutels en gevalideerde waarden.

Wat verbetert make_question?

Dit is op zichzelf een nuttig ontwerp. Eén functie geeft het programma nu een consistente manier om vraagrecords te maken.

Opdracht

Maak make_question af.

Wijs een lege vraagtekst, een leeg antwoord en punten onder 1 af door een ValueError op te werpen. Geef anders een dictionary terug met precies de waarden voor prompt, answer en points die de aanroeper heeft meegegeven.