diff --git a/.pylintrc b/.pylintrc index 0992dd8f63..86e005682e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -57,8 +57,7 @@ confidence= # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -disable=no-self-use, # disabled as it is too verbose - fixme, # disabled as TODOs would show up as warnings +disable=fixme, # disabled as TODOs would show up as warnings protected-access, # disabled as we don't follow the public vs private # convention strictly duplicate-code, # disabled as it is too verbose @@ -71,7 +70,6 @@ disable=no-self-use, # disabled as it is too verbose no-else-return, # relax "elif" after a clause with a return docstring-first-line-empty, # relax docstring style import-outside-toplevel, - bad-continuation, bad-whitespace, # differences of opinion with black assigning-non-slot # https://github.com/Qiskit/qiskit-terra/pull/7347#issuecomment-985007311 @@ -84,12 +82,6 @@ disable=no-self-use, # disabled as it is too verbose # mypackage.mymodule.MyReporterClass. output-format=text -# Put messages in a separate file for each module / package specified on the -# command line instead of printing them on stdout. Reports (if any) will be -# written in a file name "pylint_global.[txt|html]". This option is deprecated -# and it will be removed in Pylint 2.0. -files-output=no - # Tells whether to display a full report or only the messages reports=yes @@ -135,70 +127,19 @@ include-naming-hint=no # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty -# Regular expression matching correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Naming hint for module names -module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Regular expression matching correct constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Regular expression matching correct class names -class-rgx=[A-Z_][a-zA-Z0-9]+$ - -# Naming hint for class names -class-name-hint=[A-Z_][a-zA-Z0-9]+$ - -# Regular expression matching correct function names -function-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for function names -function-name-hint=[a-z_][a-z0-9_]{2,30}$ - # Regular expression matching correct method names +# Deviate from pylint default by allowing unittest style assert* methods and by +# not limiting the length of test_* method names method-rgx=(([a-z_][a-z0-9_]{2,49})|(assert[A-Z][a-zA-Z0-9]{2,43})|(test_[_a-zA-Z0-9]{2,}))$ -# Naming hint for method names -method-name-hint=[a-z_][a-z0-9_]{2,30}$ or camelCase `assert*` in tests. - -# Regular expression matching correct attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for attribute names -attr-name-hint=[a-z_][a-z0-9_]{2,30}$ - # Regular expression matching correct argument names +# Deviate from pylint default by allowing ax and dt as valid arguments argument-rgx=[a-z_][a-z0-9_]{2,30}|ax|dt$ -# Naming hint for argument names -argument-name-hint=[a-z_][a-z0-9_]{2,30}$ - # Regular expression matching correct variable names +# Deviate from pylint default by allowing two character variable names variable-rgx=[a-z_][a-z0-9_]{1,30}$ -# Naming hint for variable names -variable-name-hint=[a-z_][a-z0-9_]{1,30}$ - -# Regular expression matching correct class attribute names -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression matching correct inline iteration names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Naming hint for inline iteration names -inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 @@ -222,12 +163,6 @@ ignore-long-lines=^\s*(# )??$ # else. single-line-if-stmt=no -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma,dict-separator - # Maximum number of lines in a module max-module-lines=1000 @@ -424,4 +359,4 @@ analyse-fallback-blocks=no # Exceptions that will emit a warning when being caught. Defaults to # "Exception" -overgeneral-exceptions=Exception +overgeneral-exceptions=builtins.Exception diff --git a/qiskit_experiments/calibration_management/basis_gate_library.py b/qiskit_experiments/calibration_management/basis_gate_library.py index 30782331e0..401835fcf2 100644 --- a/qiskit_experiments/calibration_management/basis_gate_library.py +++ b/qiskit_experiments/calibration_management/basis_gate_library.py @@ -22,7 +22,7 @@ from warnings import warn from qiskit.circuit import Parameter -import qiskit.pulse as pulse +from qiskit import pulse from qiskit.pulse import ScheduleBlock from qiskit_experiments.calibration_management.calibration_key_types import DefaultCalValue @@ -33,7 +33,7 @@ class BasisGateLibrary(ABC, Mapping): """A base class for libraries of basis gates to make it easier to setup Calibrations.""" # Location where default parameter values are stored. These may be updated at construction. - __default_values__ = dict() + __default_values__ = {} def __init__( self, @@ -151,7 +151,7 @@ def config(self) -> Dict[str, Any]: return { "class": self.__class__.__name__, "kwargs": kwargs, - "hash": self.__hash__(), + "hash": hash(self), } @classmethod @@ -259,7 +259,7 @@ def _build_schedules(self, basis_gates: Set[str]) -> Dict[str, ScheduleBlock]: sched_sx = self._single_qubit_schedule("sx", dur, sx_amp, sigma, sx_beta) sched_sy = self._single_qubit_schedule("sy", dur, sy_amp, sigma, sy_beta) - schedules = dict() + schedules = {} for sched in [sched_x, sched_y, sched_sx, sched_sy]: if sched.name in basis_gates: schedules[sched.name] = sched @@ -375,7 +375,7 @@ def default_values(self) -> List[DefaultCalValue]: def _build_schedules(self, basis_gates: Set[str]) -> Dict[str, ScheduleBlock]: """Build the schedules of the CR library.""" - schedules = dict() + schedules = {} tgt_amp = Parameter("tgt_amp") sigma = Parameter("σ") diff --git a/qiskit_experiments/curve_analysis/curve_data.py b/qiskit_experiments/curve_analysis/curve_data.py index df81793568..4a84a78bd8 100644 --- a/qiskit_experiments/curve_analysis/curve_data.py +++ b/qiskit_experiments/curve_analysis/curve_data.py @@ -464,7 +464,7 @@ def set_if_empty(self, **kwargs): """ for key, value in kwargs.items(): if self.get(key) is None: - self.__setitem__(key, value) + self[key] = value @staticmethod def format(value: Any) -> Any: diff --git a/qiskit_experiments/curve_analysis/curve_fit.py b/qiskit_experiments/curve_analysis/curve_fit.py index 9f2ca9ecee..103770260d 100644 --- a/qiskit_experiments/curve_analysis/curve_fit.py +++ b/qiskit_experiments/curve_analysis/curve_fit.py @@ -134,9 +134,7 @@ def fit_func(x, *params): fit_func, xdata, ydata, sigma=sigma, p0=param_p0, bounds=param_bounds, **kwargs ) except Exception as ex: - raise AnalysisError( - "scipy.optimize.curve_fit failed with error: {}".format(str(ex)) - ) from ex + raise AnalysisError(f"scipy.optimize.curve_fit failed with error: {str(ex)}") from ex if np.isfinite(pcov).all(): # Keep parameter correlations in following analysis steps diff --git a/qiskit_experiments/curve_analysis/utils.py b/qiskit_experiments/curve_analysis/utils.py index b68d1a45ce..84d4613584 100644 --- a/qiskit_experiments/curve_analysis/utils.py +++ b/qiskit_experiments/curve_analysis/utils.py @@ -331,7 +331,7 @@ def mean_xy_data( if method == "iwv": if sigma is None: raise QiskitError( - "The inverse-weighted variance method cannot be used with" " `sigma=None`" + "The inverse-weighted variance method cannot be used with `sigma=None`" ) for i in range(x_means.size): # Get positions of y to average diff --git a/qiskit_experiments/curve_analysis/visualization/base_drawer.py b/qiskit_experiments/curve_analysis/visualization/base_drawer.py index 25af22c764..60fbca8f8f 100644 --- a/qiskit_experiments/curve_analysis/visualization/base_drawer.py +++ b/qiskit_experiments/curve_analysis/visualization/base_drawer.py @@ -88,7 +88,7 @@ def __init__(self): self._options = self._default_options() self._set_options = set() self._axis = None - self._curves = list() + self._curves = [] @property def options(self) -> Options: diff --git a/qiskit_experiments/curve_analysis/visualization/curves.py b/qiskit_experiments/curve_analysis/visualization/curves.py index 9985958e15..c04318d39f 100644 --- a/qiskit_experiments/curve_analysis/visualization/curves.py +++ b/qiskit_experiments/curve_analysis/visualization/curves.py @@ -61,7 +61,7 @@ def plot_curve_fit( ax = get_non_gui_ax() if fit_uncertainty is None: - fit_uncertainty = list() + fit_uncertainty = [] elif isinstance(fit_uncertainty, tuple): fit_uncertainty = [fit_uncertainty] diff --git a/qiskit_experiments/curve_analysis/visualization/fit_result_plotters.py b/qiskit_experiments/curve_analysis/visualization/fit_result_plotters.py index b597368fd7..a6f835c88f 100644 --- a/qiskit_experiments/curve_analysis/visualization/fit_result_plotters.py +++ b/qiskit_experiments/curve_analysis/visualization/fit_result_plotters.py @@ -135,7 +135,13 @@ def draw( transform=axis.transAxes, ) - bbox_props = dict(boxstyle="square, pad=0.3", fc="white", ec="black", lw=1, alpha=0.8) + bbox_props = { + "boxstyle": "square, pad=0.3", + "fc": "white", + "ec": "black", + "lw": 1, + "alpha": 0.8, + } report_handler.set_bbox(bbox_props) axis.tick_params(labelsize=style.tick_label_size) @@ -292,7 +298,13 @@ def draw( transform=axis.transAxes, ) - bbox_props = dict(boxstyle="square, pad=0.3", fc="white", ec="black", lw=1, alpha=0.8) + bbox_props = { + "boxstyle": "square, pad=0.3", + "fc": "white", + "ec": "black", + "lw": 1, + "alpha": 0.8, + } report_handler.set_bbox(bbox_props) axis.tick_params(labelsize=style.tick_label_size) diff --git a/qiskit_experiments/curve_analysis/visualization/mpl_drawer.py b/qiskit_experiments/curve_analysis/visualization/mpl_drawer.py index 439e562255..17345a6791 100644 --- a/qiskit_experiments/curve_analysis/visualization/mpl_drawer.py +++ b/qiskit_experiments/curve_analysis/visualization/mpl_drawer.py @@ -51,7 +51,7 @@ def __init__(self, factor: float): self.factor = factor def __call__(self, x, pos=None): - return self.fix_minus("{:.3g}".format(x * self.factor)) + return self.fix_minus(f"{x * self.factor:.3g}") def initialize_canvas(self): # Create axis if empty diff --git a/qiskit_experiments/data_processing/data_action.py b/qiskit_experiments/data_processing/data_action.py index 1c17388772..c80bc1d458 100644 --- a/qiskit_experiments/data_processing/data_action.py +++ b/qiskit_experiments/data_processing/data_action.py @@ -67,17 +67,17 @@ def _format_data(self, data: np.ndarray) -> np.ndarray: def __json_encode__(self) -> Dict[str, Any]: """Return the config dict for this node.""" - return dict( - cls=type(self), - args=tuple(getattr(self, "__init_args__", OrderedDict()).values()), - kwargs=dict(getattr(self, "__init_kwargs__", OrderedDict())), - ) + return { + "cls": type(self), + "args": tuple(getattr(self, "__init_args__", OrderedDict()).values()), + "kwargs": dict(getattr(self, "__init_kwargs__", OrderedDict())), + } @classmethod def __json_decode__(cls, config: Dict[str, Any]) -> "DataAction": """Initialize a node from config dict.""" - init_args = config.get("args", tuple()) - init_kwargs = config.get("kwargs", dict()) + init_args = config.get("args", ()) + init_kwargs = config.get("kwargs", {}) return cls(*init_args, **init_kwargs) @@ -181,9 +181,9 @@ def __json_encode__(self) -> Dict[str, Any]: @classmethod def __json_decode__(cls, config: Dict[str, Any]) -> "TrainableDataAction": """Initialize a node from config dict.""" - init_args = config.get("args", tuple()) - init_kwargs = config.get("kwargs", dict()) - params = config.get("params", dict()) + init_args = config.get("args", ()) + init_kwargs = config.get("kwargs", {}) + params = config.get("params", {}) instance = cls(*init_args, **init_kwargs) instance.set_parameters(**params) diff --git a/qiskit_experiments/data_processing/data_processor.py b/qiskit_experiments/data_processing/data_processor.py index a606e91209..80a639b123 100644 --- a/qiskit_experiments/data_processing/data_processor.py +++ b/qiskit_experiments/data_processing/data_processor.py @@ -284,11 +284,11 @@ def __repr__(self): def __json_encode__(self) -> Dict[str, Any]: """Return the config dict for this data processor.""" - return dict( - cls=type(self), - input_key=self._input_key, - nodes=self._nodes, - ) + return { + "cls": type(self), + "input_key": self._input_key, + "nodes": self._nodes, + } @classmethod def __json_decode__(cls, config: Dict[str, Any]) -> "DataProcessor": diff --git a/qiskit_experiments/framework/configs.py b/qiskit_experiments/framework/configs.py index d1941b50c8..5c92507cd9 100644 --- a/qiskit_experiments/framework/configs.py +++ b/qiskit_experiments/framework/configs.py @@ -70,7 +70,7 @@ def experiment(self): f" qiskit-experiments version ({__version__}). You could try" " installing a compatible qiskit-experiments version." ) - raise QiskitError("{}\nError Message:\n{}".format(msg, str(ex))) from ex + raise QiskitError(f"{msg}\nError Message:\n{str(ex)}") from ex @dataclasses.dataclass(frozen=True) @@ -121,4 +121,4 @@ def analysis(self): f" qiskit-experiments version ({__version__}). You could try" " installing a compatible qiskit-experiments version." ) - raise QiskitError("{}\nError Message:\n{}".format(msg, str(ex))) from ex + raise QiskitError(f"{msg}\nError Message:\n{str(ex)}") from ex diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index fc42b1945b..4b0d93e448 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -209,7 +209,7 @@ def __init__( self._experiment = experiment # data stored in the database - metadata = dict() + metadata = {} if experiment is not None: metadata = copy.deepcopy(experiment._metadata()) source = metadata.pop( @@ -803,7 +803,7 @@ def _add_job_data( return jid, False if status == JobStatus.ERROR: LOG.error( - "Job data not added for errorred job [Job ID: %s]" "\nError message: %s", + "Job data not added for errorred job [Job ID: %s]\nError message: %s", jid, job.error_message(), ) @@ -2053,7 +2053,7 @@ def __getattr__(self, name: str) -> Any: return self._extra_data[name] except KeyError: # pylint: disable=raise-missing-from - raise AttributeError("Attribute %s is not defined" % name) + raise AttributeError(f"Attribute {name} is not defined") def _safe_serialize_jobs(self): """Return serializable object for stored jobs""" diff --git a/qiskit_experiments/framework/json.py b/qiskit_experiments/framework/json.py index 01e44f8dcd..294cc14710 100644 --- a/qiskit_experiments/framework/json.py +++ b/qiskit_experiments/framework/json.py @@ -363,14 +363,16 @@ def _deserialize_object_legacy(value: Dict) -> Any: try: class_name = value["__name__"] mod_name = value["__module__"] - args = value.get("__args__", tuple()) - kwargs = value.get("__kwargs__", dict()) + args = value.get("__args__", ()) + kwargs = value.get("__kwargs__", {}) mod = importlib.import_module(mod_name) for name, cls in inspect.getmembers(mod, inspect.isclass): if name == class_name: return cls(*args, **kwargs) - raise Exception(f"Unable to find class {class_name} in module {mod_name}") + raise Exception( # pylint: disable=broad-exception-raised + f"Unable to find class {class_name} in module {mod_name}" + ) except Exception as ex: # pylint: disable=broad-except traceback_msg = "".join(traceback.format_exception(type(ex), ex, ex.__traceback__)) @@ -441,7 +443,7 @@ def settings(self) -> Dict[str, Any]: :class:`ExperimentDecoder` is invoked. """ - def default(self, obj: Any) -> Any: # pylint: disable=arguments-differ + def default(self, obj: Any) -> Any: # pylint: disable=arguments-renamed if istype(obj): return _serialize_type(obj) if hasattr(obj, "__json_encode__"): diff --git a/qiskit_experiments/framework/matplotlib.py b/qiskit_experiments/framework/matplotlib.py index c6d2c43f2f..dd98fe3652 100644 --- a/qiskit_experiments/framework/matplotlib.py +++ b/qiskit_experiments/framework/matplotlib.py @@ -36,4 +36,4 @@ def get_non_gui_ax(): """ figure = Figure() _ = default_figure_canvas(figure) - return figure.subplots() + return figure.subplots(squeeze=False)[0, 0] diff --git a/qiskit_experiments/library/characterization/analysis/tphi_analysis.py b/qiskit_experiments/library/characterization/analysis/tphi_analysis.py index 8cbd07fdd2..22b42c7567 100644 --- a/qiskit_experiments/library/characterization/analysis/tphi_analysis.py +++ b/qiskit_experiments/library/characterization/analysis/tphi_analysis.py @@ -64,9 +64,7 @@ def _run_analysis( # Run composite analysis and extract T1 and T2 results analysis_results, figures = super()._run_analysis(experiment_data) t1_result = next(filter(lambda res: res.name == "T1", analysis_results)) - t2_result = next( - filter(lambda res: res.name == "T2star" or res.name == "T2", analysis_results) - ) + t2_result = next(filter(lambda res: res.name in {"T2star", "T2"}, analysis_results)) # Calculate Tphi from T1 and T2 tphi = 1 / (1 / t2_result.value - 1 / (2 * t1_result.value)) diff --git a/qiskit_experiments/library/characterization/qubit_spectroscopy.py b/qiskit_experiments/library/characterization/qubit_spectroscopy.py index 62d6f15ba4..aacc2da5a7 100644 --- a/qiskit_experiments/library/characterization/qubit_spectroscopy.py +++ b/qiskit_experiments/library/characterization/qubit_spectroscopy.py @@ -15,10 +15,10 @@ from typing import Tuple import numpy as np -import qiskit.pulse as pulse from qiskit import QuantumCircuit from qiskit.circuit import Gate, Parameter from qiskit.exceptions import QiskitError +from qiskit import pulse from qiskit_experiments.framework import BackendTiming from qiskit_experiments.library.characterization.spectroscopy import Spectroscopy diff --git a/qiskit_experiments/library/characterization/resonator_spectroscopy.py b/qiskit_experiments/library/characterization/resonator_spectroscopy.py index 8f863e9e93..7275412f81 100644 --- a/qiskit_experiments/library/characterization/resonator_spectroscopy.py +++ b/qiskit_experiments/library/characterization/resonator_spectroscopy.py @@ -16,10 +16,10 @@ import numpy as np from qiskit import QuantumCircuit +from qiskit import pulse from qiskit.circuit import Parameter from qiskit.exceptions import QiskitError from qiskit.providers import Backend -import qiskit.pulse as pulse from qiskit_experiments.framework import BackendData, BackendTiming, Options from qiskit_experiments.library.characterization.spectroscopy import Spectroscopy diff --git a/qiskit_experiments/library/characterization/spectroscopy.py b/qiskit_experiments/library/characterization/spectroscopy.py index 21a9bf6f7c..8d2de48115 100644 --- a/qiskit_experiments/library/characterization/spectroscopy.py +++ b/qiskit_experiments/library/characterization/spectroscopy.py @@ -16,8 +16,8 @@ from typing import Iterable, Optional, Sequence import numpy as np -import qiskit.pulse as pulse from qiskit import QuantumCircuit +from qiskit import pulse from qiskit.exceptions import QiskitError from qiskit.providers import Backend from qiskit.qobj.utils import MeasLevel diff --git a/qiskit_experiments/library/quantum_volume/qv_analysis.py b/qiskit_experiments/library/quantum_volume/qv_analysis.py index c250bf9765..4b79eebcb5 100644 --- a/qiskit_experiments/library/quantum_volume/qv_analysis.py +++ b/qiskit_experiments/library/quantum_volume/qv_analysis.py @@ -95,7 +95,7 @@ def _calc_ideal_heavy_output(probabilities_vector, depth): list: the bit strings of the heavy output """ - format_spec = "{0:0%db}" % depth + format_spec = f"{{0:0{depth}b}}" # Keys are bit strings and values are probabilities of observing those strings all_output_prob_ideal = { format_spec.format(b): float(np.real(probabilities_vector[b])) @@ -126,7 +126,7 @@ def _calc_exp_heavy_output_probability(data, heavy_outputs): circ_shots = sum(data["counts"].values()) # Calculate the number of heavy output counts in the experiment - heavy_output_counts = sum([data["counts"].get(value, 0) for value in heavy_outputs]) + heavy_output_counts = sum(data["counts"].get(value, 0) for value in heavy_outputs) # Calculate the experimental heavy output probability return heavy_output_counts / circ_shots diff --git a/qiskit_experiments/library/randomized_benchmarking/clifford_utils.py b/qiskit_experiments/library/randomized_benchmarking/clifford_utils.py index a63b91459c..d594f45331 100644 --- a/qiskit_experiments/library/randomized_benchmarking/clifford_utils.py +++ b/qiskit_experiments/library/randomized_benchmarking/clifford_utils.py @@ -402,7 +402,7 @@ def _deparameterized_name(inst: Instruction) -> str: elif np.isclose(inst.params[0], -np.pi / 2): return "sdg" else: - raise QiskitError("Wrong param {} for rz in clifford".format(inst.params[0])) + raise QiskitError(f"Wrong param {inst.params[0]} for rz in clifford") return inst.name diff --git a/qiskit_experiments/library/tomography/basis/local_basis.py b/qiskit_experiments/library/tomography/basis/local_basis.py index ae921b7e21..fd42f77bd2 100644 --- a/qiskit_experiments/library/tomography/basis/local_basis.py +++ b/qiskit_experiments/library/tomography/basis/local_basis.py @@ -737,7 +737,7 @@ def _format_data_dict( elif isinstance(data, dict): iter_data = data.items() elif not data: - iter_data = dict().items() + iter_data = {}.items() else: iter_data = data diff --git a/qiskit_experiments/library/tomography/fitters/cvxpy_utils.py b/qiskit_experiments/library/tomography/fitters/cvxpy_utils.py index 2e32bfe6b9..192367f037 100644 --- a/qiskit_experiments/library/tomography/fitters/cvxpy_utils.py +++ b/qiskit_experiments/library/tomography/fitters/cvxpy_utils.py @@ -103,9 +103,7 @@ def solve_iteratively(problem: Problem, initial_iters: int, scale: int = 2, **so "value for 'max_iters' solver option." ) else: - raise AnalysisError( - "CVXPY solver failed with problem status '{}'.".format(problem.status) - ) + raise AnalysisError(f"CVXPY solver failed with problem status '{problem.status}'.") def complex_matrix_variable( diff --git a/qiskit_experiments/library/tomography/fitters/fitter_data.py b/qiskit_experiments/library/tomography/fitters/fitter_data.py index bec7693526..1ae39dfbd4 100644 --- a/qiskit_experiments/library/tomography/fitters/fitter_data.py +++ b/qiskit_experiments/library/tomography/fitters/fitter_data.py @@ -108,7 +108,10 @@ def tomography_fitter_data( # integers based on the specified number of outcomes of the measurement # bases on each qubit if outcome_size == 1: - outcome_func = lambda _: 1 + + def outcome_func(_): + return 1 + else: outcome_func = _int_outcome_function(outcome_shape) diff --git a/qiskit_experiments/library/tomography/fitters/lininv.py b/qiskit_experiments/library/tomography/fitters/lininv.py index 9a3a83d64f..952b8e5b14 100644 --- a/qiskit_experiments/library/tomography/fitters/lininv.py +++ b/qiskit_experiments/library/tomography/fitters/lininv.py @@ -181,8 +181,12 @@ def linear_inversion( f_meas_qubits = measurement_qubits f_meas_indices = slice(None) f_cond_meas_indices = slice(0, 0) - f_meas_outcome = lambda x: x - f_cond_meas_outcome = lambda x: 0 + + def f_meas_outcome(x): + return x + + def f_cond_meas_outcome(_): + return 0 # Construct dual bases meas_dual_basis = None diff --git a/qiskit_experiments/library/tomography/fitters/lstsq_utils.py b/qiskit_experiments/library/tomography/fitters/lstsq_utils.py index c46fefc585..e3c653639c 100644 --- a/qiskit_experiments/library/tomography/fitters/lstsq_utils.py +++ b/qiskit_experiments/library/tomography/fitters/lstsq_utils.py @@ -93,8 +93,15 @@ def lstsq_data( # Reduced outcome functions # Set measurement indices to an array so we can use for array indexing later measurement_indices = None - f_meas_outcome = lambda x: x - f_cond_outcome = lambda x: 0 + + def identity(x): + return x + + def zero(_): + return 0 + + f_meas_outcome = identity + f_cond_outcome = zero if num_meas_cond: f_cond_outcome = _partial_outcome_function(conditional_measurement_indices) if measurement_qubits: @@ -104,7 +111,7 @@ def lstsq_data( f_meas_outcome = _partial_outcome_function(tuple(measurement_indices)) else: measurement_indices = [] - f_meas_outcome = lambda x: 0 + f_meas_outcome = zero preparation_indices = None if num_prep_cond: diff --git a/qiskit_experiments/test/mock_iq_backend.py b/qiskit_experiments/test/mock_iq_backend.py index aa46a0049b..a874a52847 100644 --- a/qiskit_experiments/test/mock_iq_backend.py +++ b/qiskit_experiments/test/mock_iq_backend.py @@ -42,7 +42,8 @@ def __init__(self, rng_seed: int = 0): self._precomputed_probabilities = None super().__init__() - def _default_options(self): + @classmethod + def _default_options(cls): """Default options of the test backend.""" return Options( shots=1024, @@ -192,7 +193,8 @@ def __init__( super().__init__() - def _default_options(self): + @classmethod + def _default_options(cls): """Default options of the test backend.""" return Options( shots=1024, diff --git a/qiskit_experiments/test/mock_iq_helpers.py b/qiskit_experiments/test/mock_iq_helpers.py index b1f83a76c1..f583080940 100644 --- a/qiskit_experiments/test/mock_iq_helpers.py +++ b/qiskit_experiments/test/mock_iq_helpers.py @@ -465,7 +465,7 @@ def _create_qubit_exp_map(self) -> Dict[int, BaseExperiment]: qubit_experiment_mapping = {} for exp in self.exp_list: for qubit in exp.physical_qubits: - if qubit not in qubit_experiment_mapping.keys(): + if qubit not in qubit_experiment_mapping: qubit_experiment_mapping[qubit] = exp else: raise QiskitError( diff --git a/qiskit_experiments/test/pulse_backend.py b/qiskit_experiments/test/pulse_backend.py index 364dbc4316..ad77616238 100644 --- a/qiskit_experiments/test/pulse_backend.py +++ b/qiskit_experiments/test/pulse_backend.py @@ -325,7 +325,7 @@ def solve(self, schedule: Union[ScheduleBlock, Schedule], qubits: Tuple[int]) -> Time-evolution unitary operator """ if len(qubits) > 1: - QiskitError("Multi qubit gates are not yet implemented.") + raise QiskitError("Multi qubit gates are not yet implemented.") if isinstance(schedule, ScheduleBlock): schedule = block_to_schedule(schedule) diff --git a/qiskit_experiments/test/t2hahn_backend.py b/qiskit_experiments/test/t2hahn_backend.py index 8d93cfa85f..aea62e41af 100644 --- a/qiskit_experiments/test/t2hahn_backend.py +++ b/qiskit_experiments/test/t2hahn_backend.py @@ -302,7 +302,7 @@ def run(self, run_input, **options): nqubits = circ.num_qubits qubit_indices = {bit: idx for idx, bit in enumerate(circ.qubits)} clbit_indices = {bit: idx for idx, bit in enumerate(circ.clbits)} - counts = dict() + counts = {} for _ in range(shots): qubit_state = self._qubit_initialization( diff --git a/qiskit_experiments/version.py b/qiskit_experiments/version.py index 344065fbe1..a55d107814 100644 --- a/qiskit_experiments/version.py +++ b/qiskit_experiments/version.py @@ -30,14 +30,14 @@ def _minimal_ext_cmd(cmd): env["LANGUAGE"] = "C" env["LANG"] = "C" env["LC_ALL"] = "C" - proc = subprocess.Popen( + with subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd=os.path.join(os.path.dirname(ROOT_DIR)), - ) - out = proc.communicate()[0] + ) as proc: + out = proc.communicate()[0] if proc.returncode > 0: raise OSError return out @@ -55,7 +55,7 @@ def git_version(): return git_revision -with open(os.path.join(ROOT_DIR, "VERSION.txt"), "r") as version_file: +with open(os.path.join(ROOT_DIR, "VERSION.txt"), "r", encoding="utf-8") as version_file: VERSION = version_file.read().strip() diff --git a/qiskit_experiments/visualization/drawers/mpl_drawer.py b/qiskit_experiments/visualization/drawers/mpl_drawer.py index fd24ef300b..1d79c8e336 100644 --- a/qiskit_experiments/visualization/drawers/mpl_drawer.py +++ b/qiskit_experiments/visualization/drawers/mpl_drawer.py @@ -62,13 +62,13 @@ def __call__(self, x: Any, pos: int = None) -> str: Returns: The formatted tick label. """ - return self.fix_minus("{:.3g}".format(x * self.factor)) + return self.fix_minus(f"{x * self.factor:.3g}") def __init__(self): super().__init__() # Used to track which series have already been plotted. Needed for _get_default_marker and # _get_default_color. - self._series = list() + self._series = [] def initialize_canvas(self): # Create axis if empty diff --git a/qiskit_experiments/warnings.py b/qiskit_experiments/warnings.py index 3758ac2764..8be7f61e13 100644 --- a/qiskit_experiments/warnings.py +++ b/qiskit_experiments/warnings.py @@ -119,7 +119,7 @@ def new(deprecated_cls, *args, **kwargs): message += msg warnings.warn(message, DeprecationWarning, stacklevel=stacklevel) instance = object.__new__(new_cls or deprecated_cls) - instance.__init__(*args, **kwargs) + instance.__init__(*args, **kwargs) # pylint: disable=unnecessary-dunder-call return instance cls.__new__ = new diff --git a/requirements-dev.txt b/requirements-dev.txt index 19d6a12264..78c6313843 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,7 @@ black~=22.0 stestr -astroid==2.5 -pylint==2.7.1 +pylint~=2.16.2 +astroid~=2.14.2 # Must be kept aligned to what pylint wants jinja2==3.0.3 sphinx~=5.0 jupyter-sphinx>=0.4.0 diff --git a/test/calibration/test_calibration_utils.py b/test/calibration/test_calibration_utils.py index b7f5d3e22f..54af6a5513 100644 --- a/test/calibration/test_calibration_utils.py +++ b/test/calibration/test_calibration_utils.py @@ -15,8 +15,8 @@ from test.base import QiskitExperimentsTestCase import rustworkx as rx +from qiskit import pulse from qiskit.circuit import Parameter -import qiskit.pulse as pulse from qiskit_experiments.exceptions import CalibrationError from qiskit_experiments.calibration_management import EchoedCrossResonance diff --git a/test/calibration/test_calibrations.py b/test/calibration/test_calibrations.py index 33c9cec65a..7634dab578 100644 --- a/test/calibration/test_calibrations.py +++ b/test/calibration/test_calibrations.py @@ -32,10 +32,9 @@ RegisterSlot, Play, ) -from qiskit import transpile, QuantumCircuit +from qiskit import QuantumCircuit, pulse, transpile from qiskit.circuit.library import CXGate, XGate from qiskit.pulse.transforms import inline_subroutines, block_to_schedule -import qiskit.pulse as pulse from qiskit.providers import BackendV2, Options from qiskit.providers.fake_provider import FakeArmonkV2, FakeBelemV2 from qiskit.transpiler import Target @@ -178,7 +177,7 @@ def test_preserve_template(self): if sched_dict["schedule"].name == "xp": schedule = sched_dict["schedule"] - for param in {self.amp_xp, self.sigma, self.beta, self.duration, self.chan}: + for param in (self.amp_xp, self.sigma, self.beta, self.duration, self.chan): self.assertTrue(param in schedule.parameters) self.assertEqual(len(schedule.parameters), 5) diff --git a/test/calibration/test_setup_library.py b/test/calibration/test_setup_library.py index 6735e35a80..1f8925fc89 100644 --- a/test/calibration/test_setup_library.py +++ b/test/calibration/test_setup_library.py @@ -16,8 +16,8 @@ import json from test.base import QiskitExperimentsTestCase -import qiskit.pulse as pulse +from qiskit import pulse from qiskit_experiments.calibration_management.basis_gate_library import FixedFrequencyTransmon from qiskit_experiments.calibration_management.calibration_key_types import DefaultCalValue from qiskit_experiments.exceptions import CalibrationError @@ -36,7 +36,7 @@ def _build_schedules(self, basis_gates: Set[str]) -> Dict[str, pulse.ScheduleBlo with pulse.build(name="x") as schedule: pulse.play(pulse.Drag(160, 0.1, 40, 0), pulse.DriveChannel(0)) - schedules = dict() + schedules = {} if "x" in basis_gates: schedules["x"] = schedule diff --git a/test/calibration/test_update_library.py b/test/calibration/test_update_library.py index cbba148c45..7c69b5a0a0 100644 --- a/test/calibration/test_update_library.py +++ b/test/calibration/test_update_library.py @@ -14,9 +14,9 @@ from test.base import QiskitExperimentsTestCase import numpy as np +from qiskit import pulse from qiskit.circuit import Parameter from qiskit.qobj.utils import MeasLevel -import qiskit.pulse as pulse from qiskit.providers.fake_provider import FakeAthensV2 from qiskit_experiments.library import QubitSpectroscopy diff --git a/test/data_processing/base_data_processor_test.py b/test/data_processing/base_data_processor_test.py index 14c114d31e..6996fca4a6 100644 --- a/test/data_processing/base_data_processor_test.py +++ b/test/data_processing/base_data_processor_test.py @@ -30,13 +30,13 @@ def setUp(self): """Define variables needed for most tests.""" super().setUp() - self.base_result_args = dict( - backend_name="test_backend", - backend_version="1.0.0", - qobj_id="id-123", - job_id="job-123", - success=True, - ) + self.base_result_args = { + "backend_name": "test_backend", + "backend_version": "1.0.0", + "qobj_id": "id-123", + "job_id": "job-123", + "success": True, + } self.header = QobjExperimentHeader( memory_slots=2, diff --git a/test/data_processing/test_data_processing.py b/test/data_processing/test_data_processing.py index 31b1b22938..c7be7d3c96 100644 --- a/test/data_processing/test_data_processing.py +++ b/test/data_processing/test_data_processing.py @@ -68,8 +68,8 @@ def setUp(self): raw_counts1 = {"0x0": 4, "0x2": 6} raw_counts2 = {"0x0": 2, "0x2": 8} - data1 = ExperimentResultData(counts=dict(**raw_counts1)) - data2 = ExperimentResultData(counts=dict(**raw_counts2)) + data1 = ExperimentResultData(counts=raw_counts1) + data2 = ExperimentResultData(counts=raw_counts2) res1 = ExperimentResult( shots=10, success=True, meas_level=2, data=data1, header=self.header ) diff --git a/test/library/calibration/test_drag.py b/test/library/calibration/test_drag.py index 400aa7177c..19f0adf7ce 100644 --- a/test/library/calibration/test_drag.py +++ b/test/library/calibration/test_drag.py @@ -17,10 +17,10 @@ from ddt import ddt, data, unpack import numpy as np +from qiskit import pulse from qiskit.circuit import Parameter from qiskit.exceptions import QiskitError from qiskit.pulse import DriveChannel, Drag -import qiskit.pulse as pulse from qiskit.qobj.utils import MeasLevel from qiskit import transpile diff --git a/test/library/calibration/test_fine_amplitude.py b/test/library/calibration/test_fine_amplitude.py index fff8baa71c..47e119744b 100644 --- a/test/library/calibration/test_fine_amplitude.py +++ b/test/library/calibration/test_fine_amplitude.py @@ -15,10 +15,9 @@ import numpy as np from ddt import ddt, data -from qiskit import transpile +from qiskit import pulse, transpile from qiskit.circuit.library import XGate, SXGate from qiskit.pulse import DriveChannel, Drag -import qiskit.pulse as pulse from qiskit_experiments.library import ( FineXAmplitude, diff --git a/test/library/calibration/test_fine_drag.py b/test/library/calibration/test_fine_drag.py index 60c6f8479d..b1d4f36bb5 100644 --- a/test/library/calibration/test_fine_drag.py +++ b/test/library/calibration/test_fine_drag.py @@ -16,10 +16,9 @@ import copy import numpy as np -from qiskit import transpile +from qiskit import pulse, transpile from qiskit.circuit import Gate from qiskit.providers.fake_provider import FakeArmonkV2 -import qiskit.pulse as pulse from qiskit_experiments.library import FineDrag, FineXDrag, FineDragCal from qiskit_experiments.test.mock_iq_backend import MockIQBackend diff --git a/test/library/calibration/test_fine_frequency.py b/test/library/calibration/test_fine_frequency.py index ee7a49a823..85c7742f3d 100644 --- a/test/library/calibration/test_fine_frequency.py +++ b/test/library/calibration/test_fine_frequency.py @@ -16,8 +16,8 @@ import numpy as np from ddt import ddt, data +from qiskit import pulse from qiskit.providers.fake_provider import FakeArmonkV2 -import qiskit.pulse as pulse from qiskit_experiments.library import ( FineFrequency, diff --git a/test/library/calibration/test_rabi.py b/test/library/calibration/test_rabi.py index f76e7189a3..5c2321d56a 100644 --- a/test/library/calibration/test_rabi.py +++ b/test/library/calibration/test_rabi.py @@ -15,12 +15,11 @@ import unittest import numpy as np -from qiskit import QuantumCircuit, transpile +from qiskit import QuantumCircuit, pulse, transpile from qiskit.exceptions import QiskitError from qiskit.circuit import Parameter from qiskit.providers.basicaer import QasmSimulatorPy from qiskit.qobj.utils import MeasLevel -import qiskit.pulse as pulse from qiskit_experiments.framework import ExperimentData, ParallelExperiment from qiskit_experiments.library import Rabi, EFRabi diff --git a/test/library/calibration/test_rough_amplitude.py b/test/library/calibration/test_rough_amplitude.py index e5e37dc987..f7ffecc3bd 100644 --- a/test/library/calibration/test_rough_amplitude.py +++ b/test/library/calibration/test_rough_amplitude.py @@ -15,8 +15,7 @@ from test.base import QiskitExperimentsTestCase import numpy as np -from qiskit import transpile -import qiskit.pulse as pulse +from qiskit import pulse, transpile from qiskit.circuit import Parameter from qiskit_experiments.calibration_management.basis_gate_library import FixedFrequencyTransmon diff --git a/test/library/characterization/test_half_angle.py b/test/library/characterization/test_half_angle.py index 73c3aea3d7..97f5b48541 100644 --- a/test/library/characterization/test_half_angle.py +++ b/test/library/characterization/test_half_angle.py @@ -15,9 +15,8 @@ from test.base import QiskitExperimentsTestCase import copy -from qiskit import transpile +from qiskit import pulse, transpile from qiskit.providers.fake_provider import FakeAthens -import qiskit.pulse as pulse from qiskit.pulse import InstructionScheduleMap from qiskit_experiments.test.mock_iq_backend import MockIQBackend diff --git a/test/library/characterization/test_t2hahn.py b/test/library/characterization/test_t2hahn.py index e7e6f73688..e5aa5c5fd6 100644 --- a/test/library/characterization/test_t2hahn.py +++ b/test/library/characterization/test_t2hahn.py @@ -71,7 +71,7 @@ def test_t2hahn_run_end2end(self, num_of_echoes: int): readout1to0=[0.02], ) - for _ in [default_p0, dict()]: + for _ in [default_p0, {}]: exp.analysis.set_options( p0={"amp": 0.5, "tau": estimated_t2hahn, "base": 0.5}, plot=True ) diff --git a/test/library/characterization/test_t2ramsey.py b/test/library/characterization/test_t2ramsey.py index 7f080897ea..2b400d72ec 100644 --- a/test/library/characterization/test_t2ramsey.py +++ b/test/library/characterization/test_t2ramsey.py @@ -73,7 +73,7 @@ def test_t2ramsey_run_end2end(self): "base": 0.5, } - for user_p0 in [default_p0, dict()]: + for user_p0 in [default_p0, {}]: exp.analysis.set_options(p0=user_p0) expdata = exp.run(backend=backend, shots=2000, seed_simulator=1).block_for_results() self.assertExperimentDone(expdata) diff --git a/test/library/quantum_volume/qv_generate_data.py b/test/library/quantum_volume/qv_generate_data.py index eee5f08483..2401f8aff5 100644 --- a/test/library/quantum_volume/qv_generate_data.py +++ b/test/library/quantum_volume/qv_generate_data.py @@ -44,7 +44,7 @@ def create_qv_ideal_probabilities(dir_path: str): ] result_file_path = os.path.join(dir_path, "qv_ideal_probabilities.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: json.dump(simulation_probabilities, json_file, cls=ExperimentEncoder) @@ -63,7 +63,7 @@ def create_qv_data_70_trials(dir_path: str): qv_data.block_for_results() result_file_path = os.path.join(dir_path, "qv_data_70_trials.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: json.dump(qv_data.data(), json_file, cls=ExperimentEncoder) @@ -85,7 +85,7 @@ def create_qv_data_low_hop(dir_path: str): qv_data.block_for_results() result_file_path = os.path.join(dir_path, "qv_data_high_noise.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: json.dump(qv_data.data(), json_file, cls=ExperimentEncoder) @@ -108,7 +108,7 @@ def create_qv_data_low_confidence(dir_path: str): qv_data.block_for_results() result_file_path = os.path.join(dir_path, "qv_data_moderate_noise_100_trials.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: json.dump(qv_data.data(), json_file, cls=ExperimentEncoder) @@ -132,11 +132,11 @@ def create_qv_data_high_confidence(dir_path: str): qv_data.block_for_results() result_file_path = os.path.join(dir_path, "qv_data_moderate_noise_300_trials.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: json.dump(qv_data.data(), json_file, cls=ExperimentEncoder) result_file_path = os.path.join(dir_path, "qv_result_moderate_noise_300_trials.json") - with open(result_file_path, "w") as json_file: + with open(result_file_path, "w", encoding="utf-8") as json_file: result_dicts = [] for result in qv_data.analysis_results(): result_dicts.append( diff --git a/test/library/quantum_volume/test_qv.py b/test/library/quantum_volume/test_qv.py index 0c62fe7ae0..a465b91fb3 100644 --- a/test/library/quantum_volume/test_qv.py +++ b/test/library/quantum_volume/test_qv.py @@ -82,12 +82,14 @@ def test_qv_ideal_probabilities(self): self.assertTrue( matrix_equal(simulation_probabilities, statevector_probabilities), - "probabilities calculated using simulation and " "statevector are not the same", + "probabilities calculated using simulation and statevector are not the same", ) # compare to pre-calculated probabilities dir_name = os.path.dirname(os.path.abspath(__file__)) probabilities_json_file = "qv_ideal_probabilities.json" - with open(os.path.join(dir_name, probabilities_json_file), "r") as json_file: + with open( + os.path.join(dir_name, probabilities_json_file), "r", encoding="utf-8" + ) as json_file: probabilities = json.load(json_file, cls=ExperimentDecoder) self.assertTrue( matrix_equal(simulation_probabilities, probabilities), @@ -117,7 +119,7 @@ def test_qv_sigma_decreasing(self): self.assertTrue(result_data1.extra["trials"] == 2, "number of trials is incorrect") self.assertTrue( result_data2.extra["trials"] == 4, - "number of trials is incorrect" " after adding more trials", + "number of trials is incorrect after adding more trials", ) self.assertTrue( result_data2.value.s <= result_data1.value.s, @@ -131,7 +133,9 @@ def test_qv_failure_insufficient_trials(self): """ dir_name = os.path.dirname(os.path.abspath(__file__)) insufficient_trials_json_file = "qv_data_70_trials.json" - with open(os.path.join(dir_name, insufficient_trials_json_file), "r") as json_file: + with open( + os.path.join(dir_name, insufficient_trials_json_file), "r", encoding="utf-8" + ) as json_file: insufficient_trials_data = json.load(json_file, cls=ExperimentDecoder) num_of_qubits = 3 @@ -155,7 +159,9 @@ def test_qv_failure_insufficient_hop(self): """ dir_name = os.path.dirname(os.path.abspath(__file__)) insufficient_hop_json_file = "qv_data_high_noise.json" - with open(os.path.join(dir_name, insufficient_hop_json_file), "r") as json_file: + with open( + os.path.join(dir_name, insufficient_hop_json_file), "r", encoding="utf-8" + ) as json_file: insufficient_hop_data = json.load(json_file, cls=ExperimentDecoder) num_of_qubits = 4 @@ -180,7 +186,9 @@ def test_qv_failure_insufficient_confidence(self): """ dir_name = os.path.dirname(os.path.abspath(__file__)) insufficient_confidence_json = "qv_data_moderate_noise_100_trials.json" - with open(os.path.join(dir_name, insufficient_confidence_json), "r") as json_file: + with open( + os.path.join(dir_name, insufficient_confidence_json), "r", encoding="utf-8" + ) as json_file: insufficient_confidence_data = json.load(json_file, cls=ExperimentDecoder) num_of_qubits = 4 @@ -204,7 +212,7 @@ def test_qv_success(self): """ dir_name = os.path.dirname(os.path.abspath(__file__)) successful_json_file = "qv_data_moderate_noise_300_trials.json" - with open(os.path.join(dir_name, successful_json_file), "r") as json_file: + with open(os.path.join(dir_name, successful_json_file), "r", encoding="utf-8") as json_file: successful_data = json.load(json_file, cls=ExperimentDecoder) num_of_qubits = 4 @@ -216,7 +224,7 @@ def test_qv_success(self): qv_exp.analysis.run(exp_data) results_json_file = "qv_result_moderate_noise_300_trials.json" - with open(os.path.join(dir_name, results_json_file), "r") as json_file: + with open(os.path.join(dir_name, results_json_file), "r", encoding="utf-8") as json_file: successful_results = json.load(json_file, cls=ExperimentDecoder) results = exp_data.analysis_results() diff --git a/test/library/tomography/test_process_tomography.py b/test/library/tomography/test_process_tomography.py index 250e17401b..fe704abe52 100644 --- a/test/library/tomography/test_process_tomography.py +++ b/test/library/tomography/test_process_tomography.py @@ -511,8 +511,9 @@ def test_mitigated_full_qpt_random_unitary(self, qubits): # Check mitigation improves fidelity self.assertTrue( mitfid.value >= nomitfid.value, - msg="mitigated {} did not improve fidelity for qubits {} ({:.4f} < {:.4f})".format( - fitter, qubits, mitfid.value, nomitfid.value + msg=( + f"mitigated {fitter} did not improve fidelity for qubits {qubits} " + f"({mitfid.value:.4f} < {nomitfid.value:.4f})" ), ) self.assertGreater( diff --git a/test/library/tomography/test_state_tomography.py b/test/library/tomography/test_state_tomography.py index a984f76316..48c70a5e15 100644 --- a/test/library/tomography/test_state_tomography.py +++ b/test/library/tomography/test_state_tomography.py @@ -407,8 +407,9 @@ def test_mitigated_full_qst(self, qubits): # Check mitigation improves fidelity self.assertTrue( mitfid.value >= nomitfid.value, - msg="mitigated {} did not improve fidelity for qubits {} ({:.4f} < {:.4f})".format( - fitter, qubits, mitfid.value, nomitfid.value + msg=( + f"mitigated {fitter} did not improve fidelity for qubits {qubits} " + f"({mitfid.value:.4f} < {nomitfid.value:.4f})" ), ) self.assertGreater( diff --git a/tools/verify_headers.py b/tools/verify_headers.py index 6caa42d969..62ae862ed4 100755 --- a/tools/verify_headers.py +++ b/tools/verify_headers.py @@ -72,11 +72,11 @@ def validate_header(file_path): start = index break if "".join(lines[start : start + 2]) != header: - return (file_path, False, "Header up to copyright line does not match: %s" % header) + return (file_path, False, f"Header up to copyright line does not match: {header}") if not lines[start + 2].startswith("# (C) Copyright IBM 20"): return (file_path, False, "Header copyright line not found") if "".join(lines[start + 3 : start + 11]) != apache_text: - return (file_path, False, "Header apache text string doesn't match:\n %s" % apache_text) + return (file_path, False, f"Header apache text string doesn't match:\n {apache_text}") return (file_path, True, None) @@ -90,13 +90,13 @@ def main(): parser.add_argument("paths", type=str, nargs="*", default=default_paths) args = parser.parse_args() files = discover_files(args.paths) - pool = multiprocessing.Pool() - res = pool.map(validate_header, files) + with multiprocessing.Pool() as pool: + res = pool.map(validate_header, files) failed_files = [x for x in res if x[1] is False] if len(failed_files) > 0: for failed_file in failed_files: - sys.stderr.write("%s failed header check because:\n" % failed_file[0]) - sys.stderr.write("%s\n\n" % failed_file[2]) + sys.stderr.write(f"{failed_file[0]} failed header check because:\n") + sys.stderr.write(f"{failed_file[2]}\n\n") sys.exit(1) sys.exit(0)