Rozdział 17 · Architektura
GameState z dataclass
Od prototypowych zmiennych globalnych do pojedynczego typowanego obiektu stanu.
GameState — @dataclass (rozdział 14)
game_state.py
from dataclasses import dataclass, field
@dataclass
class GameState:
board: list[str] = field(default_factory=lambda: [""] * 9)
current_player: str = "X"
game_over: bool = False
winner: str | None = None
winning_line: tuple[int, int, int] | None = None
score_x: int = 0
score_o: int = 0
draws: int = 0
NIE board: list[str] = [„”
Dla
@dataclass to nawet nie jest cichy błąd: Python zauważa zmienną domyślną wartość (list, dict, set) właśnie przy ustalaniu klasy i natychmiast odmawia — ValueError: mutable default <class 'list'> for field board is not allowed: use default_factory. Klasa z takim łańcuch znaków w ogóle się nie utworzy, więc do „dzielenia między instancjami” (rozdział 14 omawiał tę pułapkę dla zwykłych domyślnych argumentów zmiennych) nie dojdzie. field(default_factory=lambda: [""] * 9) jest jedynym sposobem dataclass by za każdym razem, gdy tworzymy instancję, pole otrzymało nowy lista.Praktyka: GameState jak dataclass
Automatyczna kontrola — wartości domyślne, niezależność instancji, pola stanu