From 03bb13629a02f9c841607b9f50eeef8a7fdf1e67 Mon Sep 17 00:00:00 2001 From: Jens Hedegaard Nielsen Date: Fri, 6 Feb 2026 16:01:11 +0100 Subject: [PATCH 1/3] Implement ruff 0.15.0 support --- .../DataSet/Measuring X as a function of time.ipynb | 4 +--- src/qcodes/dataset/data_set_protocol.py | 4 ++-- src/qcodes/instrument/delegate/instrument_group.py | 2 +- src/qcodes/instrument_drivers/QDev/QDac_channels.py | 2 +- .../american_magnetics/AMI430_visa.py | 8 ++++---- .../instrument_drivers/oxford/MercuryiPS_VISA.py | 2 +- src/qcodes/instrument_drivers/oxford/triton.py | 10 +++++----- src/qcodes/instrument_drivers/rigol/Rigol_DG1062.py | 8 +++++--- src/qcodes/instrument_drivers/tektronix/AWG5014.py | 2 +- src/qcodes/interactive_widget.py | 6 +++--- tests/dataset/test_dataset_in_memory.py | 2 +- tests/parameter/test_parameter_validation.py | 4 ++-- tests/test_autoloadable_channels.py | 6 +++--- tests/test_visa.py | 2 +- 14 files changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/examples/DataSet/Measuring X as a function of time.ipynb b/docs/examples/DataSet/Measuring X as a function of time.ipynb index f09f18441a3d..6dfa1eae9c2a 100644 --- a/docs/examples/DataSet/Measuring X as a function of time.ipynb +++ b/docs/examples/DataSet/Measuring X as a function of time.ipynb @@ -77,9 +77,7 @@ "metadata": {}, "outputs": [], "source": [ - "noise = Parameter(\n", - " \"noise\", label=\"Position\", unit=\"m\", get_cmd=lambda: np.random.randn()\n", - ")\n", + "noise = Parameter(\"noise\", label=\"Position\", unit=\"m\", get_cmd=np.random.randn)\n", "time = ElapsedTimeParameter(\"time\")" ] }, diff --git a/src/qcodes/dataset/data_set_protocol.py b/src/qcodes/dataset/data_set_protocol.py index a73499153c86..38ff7aa34145 100644 --- a/src/qcodes/dataset/data_set_protocol.py +++ b/src/qcodes/dataset/data_set_protocol.py @@ -4,7 +4,7 @@ import os import warnings from collections.abc import Callable, Mapping, Sequence -from enum import Enum +from enum import StrEnum from importlib.metadata import entry_points from pathlib import Path from typing import ( @@ -555,6 +555,6 @@ def dependent_parameters(self) -> tuple[ParamSpecBase, ...]: return tuple(self.description.interdeps.dependencies.keys()) -class DataSetType(str, Enum): +class DataSetType(StrEnum): DataSet = "DataSet" DataSetInMem = "DataSetInMem" diff --git a/src/qcodes/instrument/delegate/instrument_group.py b/src/qcodes/instrument/delegate/instrument_group.py index 73367ed2870e..cd091b60b5c8 100644 --- a/src/qcodes/instrument/delegate/instrument_group.py +++ b/src/qcodes/instrument/delegate/instrument_group.py @@ -44,7 +44,7 @@ def __init__( super().__init__(name=name, **kwargs) module_name = ".".join(submodules_type.split(".")[:-1]) - instr_class_name = submodules_type.split(".")[-1] + instr_class_name = submodules_type.rsplit(".", maxsplit=1)[-1] module = importlib.import_module(module_name) instr_class = getattr(module, instr_class_name) diff --git a/src/qcodes/instrument_drivers/QDev/QDac_channels.py b/src/qcodes/instrument_drivers/QDev/QDac_channels.py index 2df822080127..a908b32d947f 100644 --- a/src/qcodes/instrument_drivers/QDev/QDac_channels.py +++ b/src/qcodes/instrument_drivers/QDev/QDac_channels.py @@ -450,7 +450,7 @@ def _num_verbose(self, s: str) -> float: value descriptor. """ if self.verbose.get_latest(): - s = s.split(": ")[-1] + s = s.rsplit(": ", maxsplit=1)[-1] return float(s) def _current_parser(self, s: str) -> float: diff --git a/src/qcodes/instrument_drivers/american_magnetics/AMI430_visa.py b/src/qcodes/instrument_drivers/american_magnetics/AMI430_visa.py index deedffb6a367..de86d4996791 100644 --- a/src/qcodes/instrument_drivers/american_magnetics/AMI430_visa.py +++ b/src/qcodes/instrument_drivers/american_magnetics/AMI430_visa.py @@ -72,7 +72,7 @@ def __init__( "enabled", label="Switch Heater Enabled", get_cmd=self._check_enabled, - set_cmd=lambda x: (self._enable() if x else self._disable()), + set_cmd=lambda x: self._enable() if x else self._disable(), vals=Bool(), ) """Parameter enabled""" @@ -80,7 +80,7 @@ def __init__( "state", label="Switch Heater On", get_cmd=self._check_state, - set_cmd=lambda x: (self._on() if x else self._off()), + set_cmd=lambda x: self._on() if x else self._off(), vals=Bool(), ) """Parameter state. Always False is the switch heater is not enabled""" @@ -262,8 +262,8 @@ def __init__( """Parameter current_ramp_limit""" self.field_ramp_limit: Parameter = self.add_parameter( "field_ramp_limit", - get_cmd=lambda: self.current_ramp_limit(), - set_cmd=lambda x: self.current_ramp_limit(x), + get_cmd=self.current_ramp_limit, + set_cmd=self.current_ramp_limit, scale=1 / float(self.ask("COIL?")), unit="T/s", ) diff --git a/src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py b/src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py index 0387ca8e6d99..9038c474f4dc 100644 --- a/src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py +++ b/src/qcodes/instrument_drivers/oxford/MercuryiPS_VISA.py @@ -73,7 +73,7 @@ def _temp_parser(response: str) -> float: response: What comes back from instrument.ask """ - return float(response.split(":")[-1][:-1]) + return float(response.rsplit(":", maxsplit=1)[-1][:-1]) class OxfordMercuryWorkerPS(InstrumentChannel): diff --git a/src/qcodes/instrument_drivers/oxford/triton.py b/src/qcodes/instrument_drivers/oxford/triton.py index d7200090f4bb..5312c4d5adc3 100644 --- a/src/qcodes/instrument_drivers/oxford/triton.py +++ b/src/qcodes/instrument_drivers/oxford/triton.py @@ -306,7 +306,7 @@ def _get_control_Bcomp_param(self, param: str) -> float | str | list[float] | No return self._get_response_value(self.ask(cmd[:-2]) + cmd[-2:]) def _get_response(self, msg: str) -> str: - return msg.split(":")[-1] + return msg.rsplit(":", maxsplit=1)[-1] def _get_response_value(self, msg: str) -> float | str | list[float] | None: msg = self._get_response(msg) @@ -551,12 +551,12 @@ def _parse_time(self, msg: str) -> str: def _parse_temp(self, msg: str) -> float | None: if "NOT_FOUND" in msg: return None - return float(msg.split("SIG:TEMP:")[-1].strip("K")) + return float(msg.rsplit("SIG:TEMP:", maxsplit=1)[-1].strip("K")) def _parse_pres(self, msg: str) -> float | None: if "NOT_FOUND" in msg: return None - return float(msg.split("SIG:PRES:")[-1].strip("mB")) * 1e3 + return float(msg.rsplit("SIG:PRES:", maxsplit=1)[-1].strip("mB")) * 1e3 def _recv(self) -> str: return super()._recv().rstrip() @@ -579,7 +579,7 @@ def _set_pump_state(self, pump: str, state: str) -> None: def _get_parser_pump_speed(self, msg: str) -> float | None: if "NOT_FOUND" in msg: return None - return float(msg.split("SPD:")[-1].strip("Hz")) + return float(msg.rsplit("SPD:", maxsplit=1)[-1].strip("Hz")) def _add_temp_state(self) -> None: for i in range(1, 17): @@ -599,7 +599,7 @@ def _set_temp_state(self, chan: str, state: str) -> None: def _get_parser_state(self, key: str, msg: str) -> str | None: if "NOT_FOUND" in msg: return None - return msg.split(f"{key}:")[-1] + return msg.rsplit(f"{key}:", maxsplit=1)[-1] Triton = OxfordTriton diff --git a/src/qcodes/instrument_drivers/rigol/Rigol_DG1062.py b/src/qcodes/instrument_drivers/rigol/Rigol_DG1062.py index 3991d8c8bba0..ac6f6d7297b9 100644 --- a/src/qcodes/instrument_drivers/rigol/Rigol_DG1062.py +++ b/src/qcodes/instrument_drivers/rigol/Rigol_DG1062.py @@ -209,9 +209,11 @@ def __init__( vals.Enum("INF", "MIN", "MAX", "HighZ"), ), get_parser=( - lambda value: "HighZ" - if float(value) > RigolDG1062Channel.max_impedance - else float(value) + lambda value: ( + "HighZ" + if float(value) > RigolDG1062Channel.max_impedance + else float(value) + ) ), set_parser=lambda value: "INF" if value == "HighZ" else value, ) diff --git a/src/qcodes/instrument_drivers/tektronix/AWG5014.py b/src/qcodes/instrument_drivers/tektronix/AWG5014.py index 2daf4cbd4392..9f0d2cf4a828 100644 --- a/src/qcodes/instrument_drivers/tektronix/AWG5014.py +++ b/src/qcodes/instrument_drivers/tektronix/AWG5014.py @@ -275,7 +275,7 @@ def __init__( get_cmd="AWGControl:SEQuencer:POSition?", set_cmd="SEQuence:JUMP:IMMediate {}", vals=vals.PermissiveInts(1), - set_parser=lambda x: round(x), + set_parser=round, ) """Parameter sequence_pos""" diff --git a/src/qcodes/interactive_widget.py b/src/qcodes/interactive_widget.py index f12c30a294f0..523dfa18015b 100644 --- a/src/qcodes/interactive_widget.py +++ b/src/qcodes/interactive_widget.py @@ -536,9 +536,9 @@ def experiments_widget( elif sort_by == "timestamp": data_sets = sorted( data_sets, - key=lambda ds: ds.run_timestamp_raw - if ds.run_timestamp_raw is not None - else 0, + key=lambda ds: ( + ds.run_timestamp_raw if ds.run_timestamp_raw is not None else 0 + ), reverse=True, ) diff --git a/tests/dataset/test_dataset_in_memory.py b/tests/dataset/test_dataset_in_memory.py index 24aee0303bc6..46825eca5704 100644 --- a/tests/dataset/test_dataset_in_memory.py +++ b/tests/dataset/test_dataset_in_memory.py @@ -691,7 +691,7 @@ def test_dataset_in_mem_with_inferred_parameters( inferred2 = ManualParameter("inferred2", initial_value=0.0) control1 = ManualParameter("control1", initial_value=0.0) control2 = ManualParameter("control2", initial_value=0.0) - dependent = Parameter("dependent", get_cmd=lambda: control1(), set_cmd=False) + dependent = Parameter("dependent", get_cmd=control1, set_cmd=False) meas = Measurement(exp=experiment, name="via Measurement") meas.register_parameter(control1) diff --git a/tests/parameter/test_parameter_validation.py b/tests/parameter/test_parameter_validation.py index 301244b97b6d..c25a69afc2cf 100644 --- a/tests/parameter/test_parameter_validation.py +++ b/tests/parameter/test_parameter_validation.py @@ -47,7 +47,7 @@ def test_setting_int_with_float() -> None: name="foobar", set_cmd=None, get_cmd=None, - set_parser=lambda x: round(x), + set_parser=round, vals=vals.PermissiveInts(0), ) @@ -65,7 +65,7 @@ def test_setting_int_with_float_not_close() -> None: name="foobar", set_cmd=None, get_cmd=None, - set_parser=lambda x: round(x), + set_parser=round, vals=vals.PermissiveInts(0), ) diff --git a/tests/test_autoloadable_channels.py b/tests/test_autoloadable_channels.py index 778bc5a4cc07..0efb7b98f833 100644 --- a/tests/test_autoloadable_channels.py +++ b/tests/test_autoloadable_channels.py @@ -79,9 +79,9 @@ def __init__(self) -> None: self._greetings = {chn: "Hello" for chn in self._channel_catalog} self._command_dict = { - r":INST:CHN(\d):HLO": lambda chn: self._greetings[chn] - + " from channel " - + str(chn), + r":INST:CHN(\d):HLO": lambda chn: ( + self._greetings[chn] + " from channel " + str(chn) + ), r":INST:CHN:ADD (\d), (.+)": self._add_channel, r":INST:CHN:DEL (\d)": self._channel_catalog.remove, r":INST:CHN:CAT": lambda: ",".join(str(i) for i in self._channel_catalog), diff --git a/tests/test_visa.py b/tests/test_visa.py index b74d607ab6ff..86e2869cecc3 100644 --- a/tests/test_visa.py +++ b/tests/test_visa.py @@ -67,7 +67,7 @@ def write( ) -> int: if self.closed: raise RuntimeError("Trying to write to a closed instrument") - num = float(message.split(":")[-1]) + num = float(message.rsplit(":", maxsplit=1)[-1]) self.state = num if num < 0: From e7f23e58a3375db96d89cef050efe394242e3717 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Fri, 6 Feb 2026 16:05:00 +0100 Subject: [PATCH 2/3] Update ruff to latest version --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c2db8486bd90..9f76808ef6e8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.14.14 + rev: v0.15.0 hooks: - id: ruff-check types_or: [python, pyi, jupyter, toml] From 3f3c76ddfc8edc5a2110d10bf8fa53761fdae005 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Mon, 9 Feb 2026 09:13:19 +0100 Subject: [PATCH 3/3] Replace strconcat with f str --- tests/test_autoloadable_channels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_autoloadable_channels.py b/tests/test_autoloadable_channels.py index 0efb7b98f833..0427f0bd7098 100644 --- a/tests/test_autoloadable_channels.py +++ b/tests/test_autoloadable_channels.py @@ -80,7 +80,7 @@ def __init__(self) -> None: self._command_dict = { r":INST:CHN(\d):HLO": lambda chn: ( - self._greetings[chn] + " from channel " + str(chn) + f"{self._greetings[chn]} from channel {chn}" ), r":INST:CHN:ADD (\d), (.+)": self._add_channel, r":INST:CHN:DEL (\d)": self._channel_catalog.remove,