# EnergyPriceFactory.py from __future__ import annotations import importlib from typing import Any, cast, Type from EnergyPrice import EnergyPriceBase def create(name: str, /, **kwargs: Any) -> EnergyPriceBase: """ Convention: module: EnergyPriceProvider.Provider class: Provider Example: create("TauronG13", rates={...}) """ safe = "".join(ch for ch in name if ch.isalnum() or ch == "_") module_name = f"EnergyPriceProvider.{safe}Provider" class_name = f"{safe}Provider" try: mod = importlib.import_module(module_name) except ModuleNotFoundError as e: raise ValueError(f"Provider module not found: {module_name}") from e try: cls = getattr(mod, class_name) except AttributeError as e: raise ValueError(f"Provider class not found: {class_name} in {module_name}") from e if not issubclass(cls, EnergyPriceBase): raise TypeError(f"{class_name} must inherit EnergyCostBase") ProviderCls = cast(Type[EnergyPriceBase], cls) return ProviderCls(**kwargs) # type: ignore[arg-type]