From 2db5424b13d5187eb9fff67ed2029df451bbab43 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Mon, 7 Mar 2022 11:23:15 +0100 Subject: [PATCH] make utils import independent of qcodes To hopefully break circular imports --- qcodes/utils/installation.py | 4 ++-- qcodes/utils/plotting.py | 9 +++++---- qcodes/utils/slack.py | 11 ++++++----- qcodes/utils/threading.py | 26 +++++++++++++------------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/qcodes/utils/installation.py b/qcodes/utils/installation.py index 6b23cd2661e8..99a8eac047ac 100644 --- a/qcodes/utils/installation.py +++ b/qcodes/utils/installation.py @@ -1,10 +1,9 @@ """This module contains helper scripts to make certain installation tasks easier.""" +import json import os import sys -import json -from qcodes.station import SCHEMA_PATH, STATION_YAML_EXT, update_config_schema def register_station_schema_with_vscode() -> None: @@ -26,6 +25,7 @@ def register_station_schema_with_vscode() -> None: For more information consult `qcodes/docs/examples/Station.ipynb`. """ + from qcodes.station import SCHEMA_PATH, STATION_YAML_EXT, update_config_schema if sys.platform != 'win32': raise RuntimeError( 'This script is only supported on Windows platforms.\n ' diff --git a/qcodes/utils/plotting.py b/qcodes/utils/plotting.py index 311c8f79e8ba..b246d247c2ab 100644 --- a/qcodes/utils/plotting.py +++ b/qcodes/utils/plotting.py @@ -6,13 +6,13 @@ """ import copy import logging -from typing import Tuple, Union, Optional, Any, cast, Set, Dict from collections import OrderedDict -import numpy as np +from typing import Any, Dict, Optional, Set, Tuple, Union, cast + import matplotlib -import matplotlib.colorbar import matplotlib.collections -import qcodes +import matplotlib.colorbar +import numpy as np log = logging.getLogger(__name__) @@ -253,6 +253,7 @@ def auto_color_scale_from_config(colorbar: matplotlib.colorbar.Colorbar, by the lower limit. Default value is read from ``config.plotting.auto_color_scale.color_under``. """ + import qcodes if colorbar is None: log.warning('"auto_color_scale_from_config" did not receive a colorbar ' 'for scaling. Are you trying to scale a plot without ' diff --git a/qcodes/utils/slack.py b/qcodes/utils/slack.py index 4a93d79d729d..399e1a48df94 100644 --- a/qcodes/utils/slack.py +++ b/qcodes/utils/slack.py @@ -56,11 +56,6 @@ from requests.packages.urllib3.exceptions import ReadTimeoutError from slack_sdk import WebClient -from qcodes import config as qc_config -from qcodes.instrument.parameter import _BaseParameter -from qcodes.loops import active_data_set, active_loop -from qcodes.plots.base import BasePlot - class SlackTimeoutWarning(UserWarning): pass @@ -123,6 +118,7 @@ def __init__(self, interval=3, config=None, auto_start=True, **commands): auto_start (bool): Defaults to True. """ + from qcodes import config as qc_config if config is not None: self.config = config else: @@ -328,6 +324,7 @@ def handle_messages(self, messages): Performs commands depending on messages. This includes adding tasks to be performed during each update. """ + from qcodes.instrument.parameter import _BaseParameter for user, user_messages in messages.items(): for message in user_messages: if message.get('user', None) != self.users[user]['id']: @@ -409,6 +406,8 @@ def upload_latest_plot(self, channel, **kwargs): Returns: None. """ + from qcodes.plots.base import BasePlot + # Create temporary filename temp_filename = tempfile.mktemp(suffix='.jpg') # Retrieve latest plot @@ -436,6 +435,7 @@ def print_measurement_information(self, channel, **kwargs): Returns: None. """ + from qcodes.loops import active_data_set dataset = active_data_set() if dataset is not None: self.slack.chat_postMessage( @@ -459,6 +459,7 @@ def check_msmt_finished(self, channel, **kwargs): Returns: bool: True if measurement is finished, False otherwise. """ + from qcodes.loops import active_loop if active_loop() is None: self.slack.chat_postMessage( text='Measurement complete', diff --git a/qcodes/utils/threading.py b/qcodes/utils/threading.py index 4b9ae9ec9994..f7a3bb31e230 100644 --- a/qcodes/utils/threading.py +++ b/qcodes/utils/threading.py @@ -11,6 +11,7 @@ from functools import partial from types import TracebackType from typing import ( + TYPE_CHECKING, Any, Callable, Dict, @@ -25,13 +26,12 @@ from typing_extensions import Protocol -from qcodes import config -from qcodes.dataset.measurements import res_type -from qcodes.instrument.parameter import ParamDataType, _BaseParameter +if TYPE_CHECKING: + from qcodes.dataset.measurements import res_type + from qcodes.instrument.parameter import ParamDataType, _BaseParameter -ParamMeasT = Union[_BaseParameter, Callable[[], None]] - -OutType = List[res_type] +ParamMeasT = Union["_BaseParameter", Callable[[], None]] +OutType = List["res_type"] T = TypeVar("T") @@ -121,11 +121,11 @@ def thread_map( class _ParamCaller: - def __init__(self, *parameters: _BaseParameter): + def __init__(self, *parameters: "_BaseParameter"): self._parameters = parameters - def __call__(self) -> Tuple[Tuple[_BaseParameter, ParamDataType], ...]: + def __call__(self) -> Tuple[Tuple["_BaseParameter", ParamDataType], ...]: output = [] for param in self._parameters: output.append((param, param.get())) @@ -138,12 +138,12 @@ def __repr__(self) -> str: def _instrument_to_param( params: Sequence[ParamMeasT] -) -> Dict[Optional[str], Tuple[_BaseParameter, ...]]: - +) -> Dict[Optional[str], Tuple["_BaseParameter", ...]]: + from qcodes.instrument.parameter import _BaseParameter real_parameters = [param for param in params if isinstance(param, _BaseParameter)] - output: Dict[Optional[str], Tuple[_BaseParameter, ...]] = defaultdict(tuple) + output: Dict[Optional[str], Tuple["_BaseParameter", ...]] = defaultdict(tuple) for param in real_parameters: if param.underlying_instrument: output[param.underlying_instrument.full_name] += (param,) @@ -185,7 +185,7 @@ def call_params_threaded(param_meas: Sequence[ParamMeasT]) -> OutType: def _call_params(param_meas: Sequence[ParamMeasT]) -> OutType: - + from qcodes.instrument.parameter import _BaseParameter output: OutType = [] for parameter in param_meas: @@ -201,7 +201,7 @@ def process_params_meas( param_meas: Sequence[ParamMeasT], use_threads: Optional[bool] = None ) -> OutType: - + from qcodes import config if use_threads is None: use_threads = config.dataset.use_threads