Skip to content

Commit fbf9f73

Browse files
committed
Use a TypedDict for simulator type hints
1 parent d143cec commit fbf9f73

File tree

1 file changed

+44
-37
lines changed

1 file changed

+44
-37
lines changed

pymodbus/datastore/simulator.py

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import random
66
import struct
77
from datetime import datetime
8-
from typing import Any, Callable
8+
from typing import Any, Callable, TypedDict
99

1010

1111
WORD_SIZE = 16
@@ -96,7 +96,14 @@ def try_get(cls, key, config_part):
9696
raise RuntimeError(txt)
9797
return config_part[key]
9898

99-
99+
ConfigType = TypedDict('ConfigType' , # noqa: UP013
100+
{
101+
'type': int,
102+
'next': int | None,
103+
'value': int,
104+
'action': str | None,
105+
'method': Callable[..., None]
106+
})
100107
class Setup:
101108
"""Setup simulator.
102109
@@ -107,41 +114,41 @@ def __init__(self, runtime):
107114
"""Initialize."""
108115
self.runtime = runtime
109116
self.config = {}
110-
self.config_types: dict[str, dict[str, Any]] = {
117+
self.config_types: dict[str, ConfigType] = {
111118
Label.type_bits: {
112-
Label.type: CellType.BITS,
113-
Label.next: None,
114-
Label.value: 0,
115-
Label.action: None,
116-
Label.method: self.handle_type_bits,
119+
'type': CellType.BITS,
120+
'next': None,
121+
'value': 0,
122+
'action': None,
123+
'method': self.handle_type_bits,
117124
},
118125
Label.type_uint16: {
119-
Label.type: CellType.UINT16,
120-
Label.next: None,
121-
Label.value: 0,
122-
Label.action: None,
123-
Label.method: self.handle_type_uint16,
126+
'type': CellType.UINT16,
127+
'next': None,
128+
'value': 0,
129+
'action': None,
130+
'method': self.handle_type_uint16,
124131
},
125132
Label.type_uint32: {
126-
Label.type: CellType.UINT32,
127-
Label.next: CellType.NEXT,
128-
Label.value: 0,
129-
Label.action: None,
130-
Label.method: self.handle_type_uint32,
133+
'type': CellType.UINT32,
134+
'next': CellType.NEXT,
135+
'value': 0,
136+
'action': None,
137+
'method': self.handle_type_uint32,
131138
},
132139
Label.type_float32: {
133-
Label.type: CellType.FLOAT32,
134-
Label.next: CellType.NEXT,
135-
Label.value: 0,
136-
Label.action: None,
137-
Label.method: self.handle_type_float32,
140+
'type': CellType.FLOAT32,
141+
'next': CellType.NEXT,
142+
'value': 0,
143+
'action': None,
144+
'method': self.handle_type_float32,
138145
},
139146
Label.type_string: {
140-
Label.type: CellType.STRING,
141-
Label.next: CellType.NEXT,
142-
Label.value: 0,
143-
Label.action: None,
144-
Label.method: self.handle_type_string,
147+
'type': CellType.STRING,
148+
'next': CellType.NEXT,
149+
'value': 0,
150+
'action': None,
151+
'method': self.handle_type_string,
145152
},
146153
}
147154

@@ -213,7 +220,7 @@ def handle_type_string(self, start, stop, value, action, action_kwargs):
213220
self.runtime.registers[start].action = action
214221
self.runtime.registers[start].action_kwargs = action_kwargs
215222

216-
def handle_setup_section(self):
223+
def handle_setup_section(self) -> None:
217224
"""Load setup section."""
218225
layout = Label.try_get(Label.setup, self.config)
219226
self.runtime.fc_offset = {key: 0 for key in range(25)}
@@ -243,12 +250,12 @@ def handle_setup_section(self):
243250
defaults_value = Label.try_get(Label.value, defaults)
244251
defaults_action = Label.try_get(Label.action, defaults)
245252
for key, entry in self.config_types.items():
246-
entry[Label.value] = Label.try_get(key, defaults_value)
253+
entry['value'] = Label.try_get(key, defaults_value)
247254
if (
248255
action := Label.try_get(key, defaults_action)
249256
) not in self.runtime.action_name_to_id:
250257
raise RuntimeError(f"ERROR illegal action {key} in {defaults_action}")
251-
entry[Label.action] = action
258+
entry['action'] = action
252259
del self.config[Label.setup]
253260

254261
def handle_invalid_address(self):
@@ -282,25 +289,25 @@ def handle_write_allowed(self):
282289
reg.access = True
283290
del self.config[Label.write]
284291

285-
def handle_types(self):
292+
def handle_types(self) -> None:
286293
"""Handle the different types."""
287294
for section, type_entry in self.config_types.items():
288295
layout = Label.try_get(section, self.config)
289296
for entry in layout:
290297
if not isinstance(entry, dict):
291-
entry = {Label.addr: entry}
292-
regs = Label.try_get(Label.addr, entry)
298+
entry = {'addr': entry}
299+
regs = Label.try_get('addr', entry)
293300
if not isinstance(regs, list):
294301
regs = [regs, regs]
295302
start = regs[0]
296303
if (stop := regs[1]) >= self.runtime.register_count:
297304
raise RuntimeError(f'Error "{section}" {start}, {stop} illegal')
298-
type_entry[Label.method](
305+
type_entry['method'](
299306
start,
300307
stop + 1,
301-
entry.get(Label.value, type_entry[Label.value]),
308+
entry.get(Label.value, type_entry['value']),
302309
self.runtime.action_name_to_id[
303-
entry.get(Label.action, type_entry[Label.action])
310+
entry.get('action', type_entry['action'])
304311
],
305312
entry.get(Label.kwargs, None),
306313
)

0 commit comments

Comments
 (0)