Как ввести общий SimulationEvent и движок в Python без ошибок «Привязанный тип TypeVar не может быть универсальным»?Python

Программы на Python
Ответить
Anonymous
 Как ввести общий SimulationEvent и движок в Python без ошибок «Привязанный тип TypeVar не может быть универсальным»?

Сообщение Anonymous »

Я создаю механизм моделирования на Python и хочу использовать универсальные шаблоны, чтобы события строго типизировались в соответствии с состоянием моделирования. У меня есть что-то вроде этого:

Код: Выделить всё

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]:
...
Я хочу, чтобы SimulationEngine также был универсальным:

Код: Выделить всё

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, чтобы: Контекст:
Это для спортивной симуляции. В конечном итоге я хочу создать подкласс SimulationState (например, PylonState) и иметь специализированные классы PylonEvent, но сохранить безопасность типов.
Любые советы по правильной настройке TypeVar или шаблонам проектирования для общих событий моделирования в Python будут очень полезны.

Подробнее здесь: https://stackoverflow.com/questions/798 ... pevar-boun
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»