Skip to content

Commit 820049d

Browse files
committed
Handle or ignore var args
1 parent 9c22d22 commit 820049d

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

src/dodal/device_manager.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,19 +95,23 @@ class DeviceFactory(Generic[Args, V2]):
9595
connected.
9696
"""
9797

98-
factory: Callable[Args, V2]
99-
use_factory_name: bool
100-
timeout: float
101-
mock: bool
102-
_skip: SkipType
103-
_manager: "DeviceManager"
104-
105-
def __init__(self, factory, use_factory_name, timeout, mock, skip, manager):
106-
if any(
107-
p.kind == Parameter.POSITIONAL_ONLY
108-
for p in inspect.signature(factory).parameters.values()
109-
):
110-
raise ValueError(f"{factory.__name__} has positional only arguments")
98+
def __init__(
99+
self,
100+
factory: Callable[Args, V2],
101+
use_factory_name: bool,
102+
timeout: float,
103+
mock: bool,
104+
skip: SkipType,
105+
manager: "DeviceManager",
106+
):
107+
for name, param in inspect.signature(factory).parameters.items():
108+
if param.kind == Parameter.POSITIONAL_ONLY:
109+
raise ValueError(
110+
f"{factory.__name__} has positional only argument '{name}'"
111+
)
112+
elif param.kind == Parameter.VAR_POSITIONAL:
113+
raise ValueError(f"{factory.__name__} has variadic argument '{name}'")
114+
111115
self.factory = factory
112116
self.use_factory_name = use_factory_name
113117
self.timeout = timeout
@@ -125,7 +129,11 @@ def name(self) -> str:
125129
def dependencies(self) -> set[str]:
126130
"""Names of all parameters"""
127131
sig = inspect.signature(self.factory)
128-
return {para.name for para in sig.parameters.values()}
132+
return {
133+
para.name
134+
for para in sig.parameters.values()
135+
if para.kind is not Parameter.VAR_KEYWORD
136+
}
129137

130138
@cached_property
131139
def optional_dependencies(self) -> set[str]:
@@ -135,6 +143,7 @@ def optional_dependencies(self) -> set[str]:
135143
para.name
136144
for para in sig.parameters.values()
137145
if para.default is not Parameter.empty
146+
and para.kind is not Parameter.VAR_KEYWORD
138147
}
139148

140149
@property
@@ -222,7 +231,7 @@ def dependencies(self) -> set[str]:
222231
sig = inspect.signature(self.post_create)
223232
# first parameter should be the device we've just built
224233
_, *params = sig.parameters.values()
225-
return {para.name for para in params}
234+
return {para.name for para in params if para.kind is not Parameter.VAR_KEYWORD}
226235

227236
@cached_property
228237
def optional_dependencies(self) -> set[str]:

0 commit comments

Comments
 (0)