Code: Select all
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Generic, Optional, TypeVar
StateT = TypeVar("StateT", bound="SimulationState")
EventT = TypeVar("EventT", bound="SimulationEvent[StateT, Any]")
class SimulationState:
...
class ModelRegistry:
...
class SimulationEvent(Generic[StateT, EventT], ABC):
@abstractmethod
def execute(
self, sim_state: StateT, models: ModelRegistry
) -> Optional[EventT]:
...
Code: Select all
class SimulationEngine(Generic[StateT, EventT]):
def __init__(self, initial_event: EventT, state: StateT):
self.current_event: Optional[EventT] = initial_event
self.state = state
self.registry: ModelRegistry = ModelRegistry()
self.register_default_models()
def register_default_models(self) -> None:
"""Register default models into the model registry."""
pass # Overridden by subclasses (like PylonEngine)
def override_default_models(self, models: Dict[str, BaseModel[Any]]) -> None:
"""Override default models with user-provided models."""
for name, model in models.items():
self.registry.override(name, model)
def run(self) -> None:
"""Run the simulation from the initial event to completion."""
self.status = SimulationStatus.RUNNING
while self.current_event:
self.current_event = self.current_event.execute(
self.state,
self.registry
)
self.status = SimulationStatus.STOPPED
Python beschwert sich:
„Der gebundene TypeVar-Typ kann nicht generisch sein. Die Typvariable „StateT“ hat in diesem Kontext keine Bedeutung.“
Ich verstehe, dassbound= kein generischer Typ sein kann, aber ich möchte:
- SimulationEvent generisch über a machen SimulationState-Unterklasse.
- Stellen Sie sicher, dass SimulationEngine weiß, dass current_event Ereignisse des richtigen Typs zurückgibt.
- Behalten Sie eine starke Typprüfung in Tools wie Pyright oder mypy bei.
Was ist die richtige Art, ein generisches Simulationsereignissystem in Python einzugeben, sodass:
- kann auf einen bestimmten Statustyp verweisen (
Code: Select all
SimulationEvent).Code: Select all
StateT - gibt das nächste Ereignis desselben Typs zurück.
Code: Select all
execute() - kann current_event ohne Typfehler verarbeiten?
Code: Select all
SimulationEngine
Dies ist für eine Sportsimulation. Ich möchte irgendwann SimulationState in eine Unterklasse umwandeln (wie PylonState) und spezielle PylonEvent-Klassen haben, aber die Typsicherheit wahren.
Jeder Rat zum richtigen TypeVar-Setup oder zu Entwurfsmustern für generische Simulationsereignisse in Python wäre sehr hilfreich.
Mobile version