|
1 | 1 | import asyncio
|
2 |
| -import dataclasses |
3 | 2 | from abc import abstractmethod
|
4 |
| -from typing import Generic, Self, TypeVar, get_args |
| 3 | +from typing import Generic, TypedDict, TypeVar, get_args |
5 | 4 |
|
6 | 5 | from ._device import Device
|
7 | 6 | from ._protocol import AsyncMovable
|
8 | 7 | from ._signal import SignalR, SignalRW
|
9 | 8 | from ._signal_backend import SignalBackend, SignalDatatypeT
|
10 | 9 |
|
11 | 10 |
|
12 |
| -@dataclasses.dataclass |
13 |
| -class TransformArgument(Generic[SignalDatatypeT]): |
14 |
| - @classmethod |
15 |
| - async def get_dataclass_from_signals(cls, device: Device) -> Self: |
16 |
| - coros = {} |
17 |
| - for field in dataclasses.fields(cls): |
18 |
| - sig = getattr(device, field.name) |
19 |
| - assert isinstance( |
20 |
| - sig, SignalR |
21 |
| - ), f"{device.name}.{field.name} is {sig}, not a Signal" |
22 |
| - coros[field.name] = sig.get_value() |
23 |
| - results = await asyncio.gather(*coros.values()) |
24 |
| - kwargs = dict(zip(coros, results, strict=True)) |
25 |
| - return cls(**kwargs) |
| 11 | +class TransformArgument(TypedDict, Generic[SignalDatatypeT]): |
| 12 | + pass |
| 13 | + |
| 14 | + |
| 15 | +T = TypeVar("T", bound=TransformArgument) |
| 16 | + |
| 17 | + |
| 18 | +async def _get_dataclass_from_signals(cls: type[T], device: Device) -> T: |
| 19 | + coros = {} |
| 20 | + for name in cls.__annotations__: |
| 21 | + signal = getattr(device, name) |
| 22 | + assert isinstance( |
| 23 | + signal, SignalR |
| 24 | + ), f"{device.name}.{name} is {signal}, not a Signal" |
| 25 | + coros[name] = signal.get_value() |
| 26 | + results = await asyncio.gather(*coros.values()) |
| 27 | + kwargs = dict(zip(coros, results, strict=True)) |
| 28 | + return cls(**kwargs) |
26 | 29 |
|
27 | 30 |
|
28 | 31 | RawT = TypeVar("RawT", bound=TransformArgument)
|
29 | 32 | DerivedT = TypeVar("DerivedT", bound=TransformArgument)
|
30 |
| -ParametersT = TypeVar("ParametersT", bound=TransformArgument) |
| 33 | +ParametersT = TypeVar("ParametersT") |
31 | 34 |
|
32 | 35 |
|
33 | 36 | class TransformMeta(type):
|
@@ -67,12 +70,12 @@ def __init__(
|
67 | 70 | self._transform = transform
|
68 | 71 |
|
69 | 72 | async def get_parameters(self) -> ParametersT:
|
70 |
| - return await self._transform.parameters_cls.get_dataclass_from_signals( |
71 |
| - self._device |
| 73 | + return await _get_dataclass_from_signals( |
| 74 | + self._transform.parameters_cls, self._device |
72 | 75 | )
|
73 | 76 |
|
74 | 77 | async def get_raw_values(self) -> RawT:
|
75 |
| - return await self._transform.raw_cls.get_dataclass_from_signals(self._device) |
| 78 | + return await _get_dataclass_from_signals(self._transform.raw_cls, self._device) |
76 | 79 |
|
77 | 80 | async def get_derived_values(self) -> DerivedT:
|
78 | 81 | raw, parameters = await asyncio.gather(
|
|
0 commit comments