diff --git a/qiskit/primitives/backend_estimator.py b/qiskit/primitives/backend_estimator.py index 0e48c5080b45..40c77f9e9a6b 100644 --- a/qiskit/primitives/backend_estimator.py +++ b/qiskit/primitives/backend_estimator.py @@ -16,6 +16,7 @@ from __future__ import annotations import copy +import typing from collections.abc import Sequence from itertools import accumulate @@ -23,7 +24,6 @@ from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile -from qiskit.opflow import PauliSumOp from qiskit.providers import BackendV1, BackendV2, Options from qiskit.quantum_info import Pauli, PauliList from qiskit.quantum_info.operators.base_operator import BaseOperator @@ -34,6 +34,9 @@ from .primitive_job import PrimitiveJob from .utils import _circuit_key, _observable_key, init_observable +if typing.TYPE_CHECKING: + from qiskit.opflow import PauliSumOp + def _run_circuits( circuits: QuantumCircuit | list[QuantumCircuit], diff --git a/qiskit/primitives/base/base_estimator.py b/qiskit/primitives/base/base_estimator.py index f091bc0d335c..1dec010d7b12 100644 --- a/qiskit/primitives/base/base_estimator.py +++ b/qiskit/primitives/base/base_estimator.py @@ -84,10 +84,10 @@ from collections.abc import Sequence from copy import copy from typing import Generic, TypeVar +import typing from qiskit.circuit import QuantumCircuit from qiskit.circuit.parametertable import ParameterView -from qiskit.opflow import PauliSumOp from qiskit.providers import JobV1 as Job from qiskit.quantum_info.operators import SparsePauliOp from qiskit.quantum_info.operators.base_operator import BaseOperator @@ -95,6 +95,9 @@ from ..utils import init_observable from .base_primitive import BasePrimitive +if typing.TYPE_CHECKING: + from qiskit.opflow import PauliSumOp + T = TypeVar("T", bound=Job) diff --git a/qiskit/primitives/estimator.py b/qiskit/primitives/estimator.py index 7333e44332c9..8afa7783ee40 100644 --- a/qiskit/primitives/estimator.py +++ b/qiskit/primitives/estimator.py @@ -17,12 +17,12 @@ from collections.abc import Sequence from typing import Any +import typing import numpy as np from qiskit.circuit import QuantumCircuit from qiskit.exceptions import QiskitError -from qiskit.opflow import PauliSumOp from qiskit.quantum_info import Statevector from qiskit.quantum_info.operators.base_operator import BaseOperator @@ -35,6 +35,9 @@ init_observable, ) +if typing.TYPE_CHECKING: + from qiskit.opflow import PauliSumOp + class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]): """ diff --git a/qiskit/primitives/utils.py b/qiskit/primitives/utils.py index 40165077e291..20db6c0d7295 100644 --- a/qiskit/primitives/utils.py +++ b/qiskit/primitives/utils.py @@ -14,6 +14,8 @@ """ from __future__ import annotations +import sys +import typing from collections.abc import Iterable import numpy as np @@ -21,11 +23,13 @@ from qiskit.circuit import Instruction, ParameterExpression, QuantumCircuit from qiskit.circuit.bit import Bit from qiskit.extensions.quantum_initializer.initializer import Initialize -from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp, Statevector from qiskit.quantum_info.operators.base_operator import BaseOperator from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli +if typing.TYPE_CHECKING: + from qiskit.opflow import PauliSumOp + def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit: """Initialize state by converting the input to a quantum circuit. @@ -58,9 +62,18 @@ def init_observable(observable: BaseOperator | PauliSumOp | str) -> SparsePauliO TypeError: If the observable is a :class:`~qiskit.opflow.PauliSumOp` and has a parameterized coefficient. """ + # This dance is to avoid importing the deprecated `qiskit.opflow` if the user hasn't already + # done so. They can't hold a `qiskit.opflow.PauliSumOp` if `qiskit.opflow` hasn't been + # imported, and we don't want unrelated Qiskit library code to be responsible for the first + # import, so the deprecation warnings will show. + if "qiskit.opflow" in sys.modules: + pauli_sum_check = sys.modules["qiskit.opflow"].PauliSumOp + else: + pauli_sum_check = () + if isinstance(observable, SparsePauliOp): return observable - elif isinstance(observable, PauliSumOp): + elif isinstance(observable, pauli_sum_check): if isinstance(observable.coeff, ParameterExpression): raise TypeError( f"Observable must have numerical coefficient, not {type(observable.coeff)}." diff --git a/releasenotes/notes/fix-primitives-import-warnings-439e3e237fdb9d7b.yaml b/releasenotes/notes/fix-primitives-import-warnings-439e3e237fdb9d7b.yaml new file mode 100644 index 000000000000..f3827cca160c --- /dev/null +++ b/releasenotes/notes/fix-primitives-import-warnings-439e3e237fdb9d7b.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Importing :mod:`qiskit.primitives` will no longer cause deprecation warnings stemming from the + deprecated :mod:`qiskit.opflow` module. These warnings would have been hidden to users by the + default Python filters, but triggered the eager import of :mod:`.opflow`, which meant that a + subsequent import by a user would not trigger the warnings.