Wie tippe ich ein generisches SimulationEvent und eine generische Engine in Python ein, ohne dass die Fehlermeldung „TypPython

Python-Programme
Anonymous
 Wie tippe ich ein generisches SimulationEvent und eine generische Engine in Python ein, ohne dass die Fehlermeldung „Typ

Post by Anonymous »

Ich baue eine Simulations-Engine in Python und möchte Generika verwenden, damit Ereignisse stark auf einen Simulationsstatus typisiert werden. Ich habe so etwas:

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]:
...
Ich möchte, dass die SimulationEngine auch generisch ist:

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
Problem:
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.
Frage:
Was ist die richtige Art, ein generisches Simulationsereignissystem in Python einzugeben, sodass:
  • Code: Select all

    SimulationEvent
    kann auf einen bestimmten Statustyp verweisen (

    Code: Select all

    StateT
    ).
  • Code: Select all

    execute()
    gibt das nächste Ereignis desselben Typs zurück.
  • Code: Select all

    SimulationEngine
    kann current_event ohne Typfehler verarbeiten?
Kontext:
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post