Dataclasses und Wertobjekte · Übung
Standardwerte für Dataclasses festlegen
Ein erzeugter Konstruktor kann wie eine selbst geschriebene Funktion Standardwerte haben.
Der erste Aufruf verwendet einen Punkt, der zweite überschreibt diesen Wert. Der Standardwert steht am annotierten Feld.
Pflichtfelder stehen zuerst
Für Dataclasses gilt dieselbe Regel wie für Funktionsparameter: Ein erforderlicher Wert darf nicht hinter einem Wert mit Standard stehen.
@dataclass
class BrokenQuestion:
points: int = 1
prompt: str
Schreibe zuerst alle Pflichtfelder, dann die Felder mit Standardwerten:
@dataclass
class QuizConfig:
title: str
pass_mark: float = 0.6
shuffle: bool = False
time_limit: int = 0
Hier bedeutet 0, dass es kein Zeitlimit gibt. Jeder Standardwert passt zum daneben angegebenen Typ.
Warum muss title vor pass_mark stehen?
Standardwerte beschreiben den üblichen Fall
Ein guter Standardwert macht gewöhnliche Konstruktoraufrufe kürzer, ohne eine wichtige Entscheidung zu verstecken. Ein Punkt und eine Bestehensgrenze von 60 Prozent sind vernünftige übliche Fälle. Ein Quiztitel ist das nicht und bleibt deshalb erforderlich.
Verwende unveränderliche Werte wie Zahlen, Strings, boolesche Werte und None als direkte Standardwerte. Eine Liste braucht eine andere Behandlung, weil sie sich verändern lässt. Die nächste Lektion gibt jedem Objekt seine eigene Liste.
Die Übung konzentriert sich auf skalare Standardwerte und ihre Reihenfolge.
Aufgabe
Ergänze die skalaren Standardwerte, die jede Dataclass benötigt.
QuizConfig.title bleibt erforderlich. pass_mark erhält den Standard 0.6, shuffle den Standard False und time_limit den Standard 0, also kein Limit.
Question.prompt und answer bleiben erforderlich. points erhält den Standard 1.
Halte Pflichtfelder vor Feldern mit Standardwerten und prüfe, dass sich jeder Standardwert weiterhin überschreiben lässt.
Halte die Dataclasses mit __post_init__ gültig. Eine Konfiguration braucht einen nicht leeren Titel, einen pass_mark über 0 und höchstens 1 sowie ein nicht negatives time_limit. Eine Frage braucht einen nicht leeren Fragetext, eine nicht leere erwartete Antwort und positive Punkte.