Код: Выделить всё
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]:
...
Код: Выделить всё
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 жалуется:
"Привязанный тип TypeVar не может быть универсальным. Переменная типа "StateT" не имеет значения в этом контексте"
Я понимаю, чтоbound= не может быть универсальным типом, но я хочу:
- Сделать SimulationEvent универсальным для Подкласс SimulationState.
- Убедитесь, что SimulationEngine знает, что current_event возвращает события правильного типа.
- Продолжайте строгую проверку типов в таких инструментах, как Pyright или mypy.
Как правильно ввести общую систему событий моделирования в Python, чтобы:
- может ссылаться на определенный тип состояния (
Код: Выделить всё
SimulationEvent).Код: Выделить всё
StateT - возвращает следующее событие того же типа.
Код: Выделить всё
execute() - может обрабатывать current_event без ошибок типа?
Код: Выделить всё
SimulationEngine
Это для спортивной симуляции. В конечном итоге я хочу создать подкласс SimulationState (например, PylonState) и иметь специализированные классы PylonEvent, но сохранить безопасность типов.
Любые советы по правильной настройке TypeVar или шаблонам проектирования для общих событий моделирования в Python будут очень полезны.
Подробнее здесь: https://stackoverflow.com/questions/798 ... pevar-boun
Мобильная версия