0%

Dataclasses en waardeobjecten · oefening

Vervang een onveranderbare waarde

Een bevroren waarde kan niet worden aangepast. Programma’s hebben nog steeds een versie nodig waarin één gegeven is veranderd.

Zo gedragen strings zich al:

Try it

Het origineel blijft bestaan en de bewerking geeft een nieuwe waarde terug.

Vervang geselecteerde velden

dataclasses.replace kopieert een dataclass en verandert daarbij benoemde velden:

Try it

Elk veld dat niet in de aanroep wordt genoemd wordt gekopieerd. Het origineel blijft onaangeroerd.

Een kleine domeinfunctie kan de wijziging een bruikbare naam geven:

def without_seconds(duration):
    return replace(duration, seconds=0)

Wat doet replace(question, points=5)?

Gebruik vervanging als zowel de oude als de nieuwe waarde betekenis heeft. Een aangepaste vraag wist niet uit dat de eerdere versie heeft bestaan.

De oefening schrijft twee specifiek benoemde omzettingen en controleert dat elk origineel onaangeroerd blijft.

Opdracht

Schrijf twee functies die met dataclasses.replace nieuwe Question-waarden maken.

worth_more(question, extra) geeft een vraag terug die extra meer punten waard is.

retitled(question, prompt) geeft een vraag terug met de nieuwe vraagtekst.

Elke functie moet de oorspronkelijke vraag ongewijzigd laten en elk veld behouden dat niet veranderd hoefde te worden.

De __post_init__ van Question behoudt de bestaande geldigheidsregels. Dat betekent dat een extra waardoor de punten niet-positief worden en een lege vervangende vraagtekst via normaal aanmaken ValueError moeten opgooien.