0%

Dataclasses en waardeobjecten · oefening

Stel standaardwaarden voor dataclasses in

Een gegenereerde constructor kan standaardwaarden hebben, net als een functie die je zelf schrijft.

Try it

De eerste aanroep gebruikt één punt; de tweede overschrijft dat. De standaardwaarde staat bij het geannoteerde veld.

Verplichte velden komen eerst

Dataclasses volgen dezelfde regel als functieparameters: een verplichte waarde mag niet na een waarde met een standaard komen.

@dataclass
class BrokenQuestion:
    points: int = 1
    prompt: str

Zet alle verplichte velden eerst en daarna de velden met standaardwaarden:

@dataclass
class QuizConfig:
    title: str
    pass_mark: float = 0.6
    shuffle: bool = False
    time_limit: int = 0

Hier betekent 0 geen tijdslimiet. Elke standaardwaarde past bij het type dat ernaast staat.

Waarom moet title vóór pass_mark staan?

Standaardwaarden beschrijven het gebruikelijke geval

Een goede standaardwaarde haalt ruis uit gewone aanroepen zonder een belangrijke keuze te verbergen. Eén punt en een slaaggrens van 60 procent zijn redelijke gebruikelijke gevallen. Een quiztitel is dat niet en blijft daarom verplicht.

Gebruik onveranderbare waarden zoals getallen, strings, booleaanse waarden en None als directe standaardwaarden. Een lijst vraagt om een andere aanpak omdat die kan veranderen; de volgende les geeft elk object een eigen lijst.

De oefening richt zich alleen op scalaire standaardwaarden en hun volgorde.

Opdracht

Voeg de scalaire standaardwaarden toe die elke dataclass nodig heeft.

QuizConfig.title blijft verplicht. pass_mark krijgt standaard 0.6, shuffle krijgt False en time_limit krijgt 0, wat geen limiet betekent.

Question.prompt en answer blijven verplicht. points krijgt standaard 1.

Houd verplichte velden vóór velden met standaardwaarden en controleer of elke standaardwaarde nog steeds kan worden overschreven.

Houd de dataclasses geldig in __post_init__. Een configuratie heeft een niet-lege titel nodig, een pass_mark boven 0 en maximaal 1, en een niet-negatieve time_limit. Een vraag heeft een niet-lege vraagtekst en een niet-leeg antwoord nodig, plus positieve punten.