from typing import Callable, Protocol
[docs]class Device(Protocol):
"""Basic representation of a device."""
model: str
manufacturer: str
@property
def device_type(self) -> str:
...
# Dictionary to track which device type is initiated by which class
device_creation_funcs: dict[str, Callable[..., Device]] = {}
[docs]def register(device_type: str, creation_func: Callable[..., Device]) -> None:
"""Register a new device type."""
device_creation_funcs[device_type] = creation_func
[docs]def unregister(device_type: str) -> None:
"""Unregister a device type."""
device_creation_funcs.pop(device_type, None)
[docs]def create(arguments: dict[str, any]) -> tuple[Device, str]:
"""Create a device of a specific type, given a dictionary of arguments."""
args_copy = arguments.copy()
device_type = args_copy.pop("device_type")
if "device_id" in args_copy.keys():
device_id = args_copy.pop("device_id")
else:
device_id = None
try:
creation_func = device_creation_funcs[device_type]
return creation_func(**args_copy), device_id
except KeyError:
raise ValueError(f"Unknown device type {device_type!r}") from None