Skip to content

Commit 36967bf

Browse files
authored
Merge pull request #8024 from jenshnielsen/parameter_kwargs_dict
Parameter kwargs dict
2 parents 29b6b4a + 2065480 commit 36967bf

17 files changed

Lines changed: 567 additions & 243 deletions
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Add ``ParameterBaseKWArgs`` and ``ParameterKWArgs`` TypedDicts for typing ``**kwargs``
2+
forwarded through the ``Parameter`` class hierarchy. Subclasses of ``Parameter`` can now
3+
use ``**kwargs: Unpack[ParameterKWArgs]`` for statically checked kwargs forwarding.

src/qcodes/instrument_drivers/Keysight/N52xx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class FormattedSweep(ParameterWithSetpoints[npt.NDArray, "KeysightPNATrace"]):
7979
def __init__(
8080
self,
8181
name: str,
82-
instrument: "KeysightPNABase",
82+
instrument: "KeysightPNATrace",
8383
sweep_format: str,
8484
label: str,
8585
unit: str,

src/qcodes/parameters/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,11 @@
7777
from .grouped_parameter import DelegateGroup, DelegateGroupParameter, GroupedParameter
7878
from .multi_channel_instrument_parameter import MultiChannelInstrumentParameter
7979
from .multi_parameter import MultiParameter
80-
from .parameter import ManualParameter, Parameter
80+
from .parameter import ManualParameter, Parameter, ParameterKWArgs
8181
from .parameter_base import (
8282
ParamDataType,
8383
ParameterBase,
84+
ParameterBaseKWArgs,
8485
ParameterSet,
8586
ParamRawDataType,
8687
invert_val_mapping,
@@ -112,6 +113,8 @@
112113
"ParamSpecBaseDict",
113114
"Parameter",
114115
"ParameterBase",
116+
"ParameterBaseKWArgs",
117+
"ParameterKWArgs",
115118
"ParameterSet",
116119
"ParameterWithSetpoints",
117120
"ScaledParameter",

src/qcodes/parameters/array_parameter.py

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@
1414
has_loop = False
1515
from typing import Generic
1616

17-
from .parameter_base import InstrumentTypeVar_co, ParameterBase, ParameterDataTypeVar
17+
from .parameter_base import (
18+
InstrumentTypeVar_co,
19+
ParameterBase,
20+
ParameterBaseKWArgs,
21+
ParameterDataTypeVar,
22+
)
1823
from .sequence_helpers import is_sequence_of
1924

2025
if TYPE_CHECKING:
21-
from collections.abc import Mapping, Sequence
26+
from collections.abc import Sequence
27+
28+
from typing_extensions import Unpack
2229

2330

2431
try:
@@ -80,9 +87,6 @@ class ArrayParameter(
8087
to expect. Scalars should be denoted by (), 1D arrays as (n,),
8188
2D arrays as (n, m), etc.
8289
83-
instrument: The instrument this parameter
84-
belongs to, if any.
85-
8690
label: Normally used as the axis label when this
8791
parameter is graphed, along with ``unit``.
8892
@@ -111,21 +115,10 @@ class ArrayParameter(
111115
field of the object. The ``__doc__`` field of the instance
112116
is used by some help systems, but not all.
113117
114-
snapshot_get: Prevent any update to the parameter, for example
115-
if it takes too long to update. Default ``True``.
116-
117-
snapshot_value: Should the value of the parameter be stored in the
118-
snapshot. Unlike Parameter this defaults to False as
119-
ArrayParameters are potentially huge.
120-
121-
snapshot_exclude: ``True`` prevents parameter to be
122-
included in the snapshot. Useful if there are many of the same
123-
parameter which are clogging up the snapshot.
124-
125-
Default ``False``.
126-
127-
metadata: Extra information to include with the
128-
JSON snapshot of the parameter.
118+
**kwargs: Forwarded to the ``ParameterBase`` base class.
119+
Note that ``snapshot_value`` defaults to ``False`` for
120+
``ArrayParameter``. See :class:`ParameterBaseKWArgs` for
121+
details.
129122
130123
"""
131124

@@ -134,29 +127,20 @@ def __init__(
134127
name: str,
135128
*,
136129
shape: Sequence[int],
137-
# mypy seems to be confused here. The bound and default for InstrumentTypeVar_co
138-
# contains None but mypy will not allow it as a default as of v 1.19.0
139-
instrument: InstrumentTypeVar_co = None, # type: ignore[assignment]
140130
label: str | None = None,
141131
unit: str | None = None,
142132
setpoints: Sequence[Any] | None = None,
143133
setpoint_names: Sequence[str] | None = None,
144134
setpoint_labels: Sequence[str] | None = None,
145135
setpoint_units: Sequence[str] | None = None,
146136
docstring: str | None = None,
147-
snapshot_get: bool = True,
148-
snapshot_value: bool = False,
149-
snapshot_exclude: bool = False,
150-
metadata: Mapping[Any, Any] | None = None,
151-
**kwargs: Any,
137+
**kwargs: Unpack[
138+
ParameterBaseKWArgs[ParameterDataTypeVar, InstrumentTypeVar_co]
139+
],
152140
) -> None:
141+
kwargs.setdefault("snapshot_value", False)
153142
super().__init__(
154143
name,
155-
instrument=instrument,
156-
snapshot_get=snapshot_get,
157-
metadata=metadata,
158-
snapshot_value=snapshot_value,
159-
snapshot_exclude=snapshot_exclude,
160144
**kwargs,
161145
)
162146

src/qcodes/parameters/delegate_parameter.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
from typing_extensions import TypeVar
66

7-
from .parameter import Parameter
7+
from .parameter import Parameter, ParameterKWArgs
88
from .parameter_base import InstrumentTypeVar_co, ParameterDataTypeVar
99

1010
if TYPE_CHECKING:
1111
from collections.abc import Sequence
1212
from datetime import datetime
1313

14+
from typing_extensions import Unpack
15+
1416
from qcodes.instrument import InstrumentBase
1517
from qcodes.validators.validators import Validator
1618

@@ -70,6 +72,10 @@ class DelegateParameter(
7072
You should pass ``bind_to_instrument=True`` if you want this to
7173
be the case.
7274
75+
``set_cmd`` and ``get_cmd`` are not allowed since the source
76+
parameter's commands are used. Providing ``initial_value`` or
77+
``initial_cache_value`` without a source is also an error.
78+
7379
"""
7480

7581
class _DelegateCache(
@@ -178,10 +184,9 @@ def __init__(
178184
name: str,
179185
*,
180186
source: Parameter | None,
181-
**kwargs: Any,
187+
**kwargs: Unpack[ParameterKWArgs[ParameterDataTypeVar, InstrumentTypeVar_co]],
182188
):
183-
if "bind_to_instrument" not in kwargs.keys():
184-
kwargs["bind_to_instrument"] = False
189+
kwargs.setdefault("bind_to_instrument", False)
185190

186191
for cmd in ("set_cmd", "get_cmd"):
187192
if cmd in kwargs:

src/qcodes/parameters/group_parameter.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
from collections import OrderedDict
1010
from typing import TYPE_CHECKING, Any
1111

12-
from .parameter import Parameter
12+
from .parameter import Parameter, ParameterKWArgs
1313

1414
if TYPE_CHECKING:
1515
from collections.abc import Callable, Mapping, Sequence
1616

17+
from typing_extensions import Unpack
18+
1719
from qcodes.instrument import InstrumentBase
1820

1921
from .parameter_base import ParamDataType, ParamRawDataType
@@ -37,33 +39,28 @@ class GroupParameter(Parameter):
3739
3840
Args:
3941
name: Name of the parameter.
40-
instrument: Instrument that this parameter belongs to; this instrument
41-
is used by the group to call its get and set commands.
42-
initial_value: Initial value of the parameter. Note that either none or
43-
all of the parameters in a :class:`.Group` should have an initial
44-
value.
45-
46-
**kwargs: All kwargs used by the :class:`.Parameter` class, except
47-
``set_cmd`` and ``get_cmd``.
42+
**kwargs: Forwarded to the ``Parameter`` base class.
43+
See :class:`ParameterKWArgs` for details.
44+
Note that ``set_cmd`` and ``get_cmd`` are not allowed.
45+
``initial_value``, if provided, is deferred until the
46+
parameter is added to a :class:`.Group`.
4847
4948
"""
5049

5150
def __init__(
5251
self,
5352
name: str,
54-
*,
55-
instrument: InstrumentBase | None = None,
56-
initial_value: float | str | None = None,
57-
**kwargs: Any,
53+
**kwargs: Unpack[ParameterKWArgs],
5854
) -> None:
5955
if "set_cmd" in kwargs or "get_cmd" in kwargs:
6056
raise ValueError(
6157
"A GroupParameter does not use 'set_cmd' or 'get_cmd' kwarg"
6258
)
6359

6460
self._group: Group | None = None
65-
self._initial_value = initial_value
66-
super().__init__(name, instrument=instrument, **kwargs)
61+
self._initial_value = kwargs.get("initial_value")
62+
kwargs["initial_value"] = None
63+
super().__init__(name, **kwargs)
6764

6865
@property
6966
def group(self) -> Group | None:

src/qcodes/parameters/grouped_parameter.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@
66

77
from .delegate_parameter import DelegateParameter
88
from .group_parameter import Group, GroupParameter
9-
from .parameter_base import ParamDataType, ParameterBase, ParamRawDataType
9+
from .parameter_base import (
10+
ParamDataType,
11+
ParameterBase,
12+
ParameterBaseKWArgs,
13+
ParamRawDataType,
14+
)
1015

1116
if TYPE_CHECKING:
1217
from collections.abc import Callable, Iterable, Mapping, Sequence
1318

14-
from qcodes.instrument import InstrumentBase
19+
from typing_extensions import Unpack
1520

16-
from .parameter import Parameter
21+
from .parameter import Parameter, ParameterKWArgs
1722

1823

1924
_log = logging.getLogger(__name__)
@@ -24,15 +29,11 @@ def __init__(
2429
self,
2530
name: str,
2631
source: Parameter | None,
27-
instrument: InstrumentBase | None = None,
28-
initial_value: float | str | None = None,
29-
**kwargs: Any,
32+
**kwargs: Unpack[ParameterKWArgs],
3033
) -> None:
3134
super().__init__(
3235
name=name,
3336
source=source,
34-
instrument=instrument,
35-
initial_value=initial_value,
3637
**kwargs,
3738
)
3839

@@ -161,7 +162,8 @@ class GroupedParameter(ParameterBase):
161162
group: Group that contains the target parameter(s).
162163
unit: The unit of measure. Use ``''`` for unitless.
163164
label: Optional label, defaults to parameter name.
164-
default set method(s).
165+
**kwargs: Forwarded to the ``ParameterBase`` base class.
166+
See :class:`ParameterBaseKWArgs` for details.
165167
166168
"""
167169

@@ -172,7 +174,7 @@ def __init__(
172174
group: DelegateGroup,
173175
unit: str | None = None,
174176
label: str | None = None,
175-
**kwargs: Any,
177+
**kwargs: Unpack[ParameterBaseKWArgs],
176178
):
177179
super().__init__(name, **kwargs)
178180
self.label = name if label is None else label

src/qcodes/parameters/multi_parameter.py

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
from __future__ import annotations
22

33
import os
4-
from collections.abc import Iterator, Mapping, Sequence
5-
from typing import Any, Generic
4+
from collections.abc import Iterator, Sequence
5+
from typing import TYPE_CHECKING, Any, Generic
66

77
import numpy as np
88

9-
from .parameter_base import InstrumentTypeVar_co, ParameterBase, ParameterDataTypeVar
9+
from .parameter_base import (
10+
InstrumentTypeVar_co,
11+
ParameterBase,
12+
ParameterBaseKWArgs,
13+
ParameterDataTypeVar,
14+
)
1015
from .sequence_helpers import is_sequence_of
1116

17+
if TYPE_CHECKING:
18+
from typing_extensions import Unpack
19+
1220
try:
1321
from qcodes_loop.data.data_array import DataArray
1422

@@ -84,9 +92,6 @@ class MultiParameter(
8492
each item. Scalars should be denoted by (), 1D arrays as (n,),
8593
2D arrays as (n, m), etc.
8694
87-
instrument: The instrument this parameter
88-
belongs to, if any.
89-
9095
labels: A label for each item. Normally used
9196
as the axis label when a component is graphed, along with the
9297
matching entry from ``units``.
@@ -119,20 +124,10 @@ class MultiParameter(
119124
field of the object. The ``__doc__`` field of the instance is
120125
used by some help systems, but not all
121126
122-
snapshot_get: Prevent any update to the parameter, for example
123-
if it takes too long to update. Default ``True``.
124-
125-
snapshot_value: Should the value of the parameter be stored in the
126-
snapshot. Unlike Parameter this defaults to False as
127-
MultiParameters are potentially huge.
128-
129-
snapshot_exclude: True prevents parameter to be
130-
included in the snapshot. Useful if there are many of the same
131-
parameter which are clogging up the snapshot.
132-
Default ``False``.
133-
134-
metadata: Extra information to include with the
135-
JSON snapshot of the parameter.
127+
**kwargs: Forwarded to the ``ParameterBase`` base class.
128+
Note that ``snapshot_value`` defaults to ``False`` for
129+
``MultiParameter``. See :class:`ParameterBaseKWArgs` for
130+
details.
136131
137132
"""
138133

@@ -142,29 +137,20 @@ def __init__(
142137
*,
143138
names: Sequence[str],
144139
shapes: Sequence[Sequence[int]],
145-
# mypy seems to be confused here. The bound and default for InstrumentTypeVar_co
146-
# contains None but mypy will not allow it as a default as of v 1.19.0
147-
instrument: InstrumentTypeVar_co = None, # type: ignore[assignment]
148140
labels: Sequence[str] | None = None,
149141
units: Sequence[str] | None = None,
150142
setpoints: Sequence[Sequence[Any]] | None = None,
151143
setpoint_names: Sequence[Sequence[str]] | None = None,
152144
setpoint_labels: Sequence[Sequence[str]] | None = None,
153145
setpoint_units: Sequence[Sequence[str]] | None = None,
154146
docstring: str | None = None,
155-
snapshot_get: bool = True,
156-
snapshot_value: bool = False,
157-
snapshot_exclude: bool = False,
158-
metadata: Mapping[Any, Any] | None = None,
159-
**kwargs: Any,
147+
**kwargs: Unpack[
148+
ParameterBaseKWArgs[ParameterDataTypeVar, InstrumentTypeVar_co]
149+
],
160150
) -> None:
151+
kwargs.setdefault("snapshot_value", False)
161152
super().__init__(
162153
name,
163-
instrument=instrument,
164-
snapshot_get=snapshot_get,
165-
metadata=metadata,
166-
snapshot_value=snapshot_value,
167-
snapshot_exclude=snapshot_exclude,
168154
**kwargs,
169155
)
170156

0 commit comments

Comments
 (0)