0%

Dataclasses und Wertobjekte · Übung

Standardwerte für Dataclasses festlegen

Ein erzeugter Konstruktor kann wie eine selbst geschriebene Funktion Standardwerte haben.

Try it

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.