diff --git a/qiskit/dagcircuit/dagcircuit.py b/qiskit/dagcircuit/dagcircuit.py index e11b218efba7..4233144c86fe 100644 --- a/qiskit/dagcircuit/dagcircuit.py +++ b/qiskit/dagcircuit/dagcircuit.py @@ -23,6 +23,7 @@ from collections import OrderedDict, defaultdict, deque, namedtuple import copy import math +import warnings from typing import Dict, Generator, Any, List import numpy as np @@ -656,8 +657,16 @@ def apply_operation_back(self, op, qargs=(), cargs=(), *, check=True): DAGCircuitError: if a leaf node is connected to multiple outputs """ - qargs = tuple(qargs) if qargs is not None else () - cargs = tuple(cargs) if cargs is not None else () + if qargs is None: + _warn_none_args() + qargs = () + else: + qargs = tuple(qargs) + if cargs is None: + _warn_none_args() + cargs = () + else: + cargs = tuple(cargs) if self._operation_may_have_bits(op): # This is the slow path; most of the time, this won't happen. @@ -701,8 +710,16 @@ def apply_operation_front(self, op, qargs=(), cargs=(), *, check=True): Raises: DAGCircuitError: if initial nodes connected to multiple out edges """ - qargs = tuple(qargs) if qargs is not None else () - cargs = tuple(cargs) if cargs is not None else () + if qargs is None: + _warn_none_args() + qargs = () + else: + qargs = tuple(qargs) + if cargs is None: + _warn_none_args() + cargs = () + else: + cargs = tuple(cargs) if self._operation_may_have_bits(op): # This is the slow path; most of the time, this won't happen. @@ -2099,3 +2116,12 @@ def draw(self, scale=0.7, filename=None, style="color"): from qiskit.visualization.dag_visualization import dag_drawer return dag_drawer(dag=self, scale=scale, filename=filename, style=style) + + +def _warn_none_args(): + warnings.warn( + "Passing 'None' as the qubits or clbits of an operation to 'DAGCircuit' methods" + " is deprecated since Qiskit 0.45 and will be removed in Qiskit 1.0. Instead, pass '()'.", + DeprecationWarning, + stacklevel=3, + ) diff --git a/qiskit/transpiler/passes/scheduling/padding/base_padding.py b/qiskit/transpiler/passes/scheduling/padding/base_padding.py index 0bac3ba95e96..a90f0c339ced 100644 --- a/qiskit/transpiler/passes/scheduling/padding/base_padding.py +++ b/qiskit/transpiler/passes/scheduling/padding/base_padding.py @@ -198,7 +198,7 @@ def _apply_scheduled_op( t_start: int, oper: Instruction, qubits: Qubit | Iterable[Qubit], - clbits: Clbit | Iterable[Clbit] | None = None, + clbits: Clbit | Iterable[Clbit] = (), ): """Add new operation to DAG with scheduled information. diff --git a/releasenotes/notes/dag-deprecate-none-args-e6ef868148da275d.yaml b/releasenotes/notes/dag-deprecate-none-args-e6ef868148da275d.yaml new file mode 100644 index 000000000000..7c1be31b5783 --- /dev/null +++ b/releasenotes/notes/dag-deprecate-none-args-e6ef868148da275d.yaml @@ -0,0 +1,7 @@ +--- +deprecations: + - | + Passing ``None`` as the ``qargs`` or ``cargs`` arguments to :meth:`.DAGCircuit.apply_operation_back` + or :meth:`~.DAGCircuit.apply_operation_front` is deprecated and will be removed in Qiskit 1.0. + This has been explicitly against the typing documentation for some time, but silently accepted + by Qiskit. Instead, simply pass ``()`` rather than ``None``. diff --git a/test/python/dagcircuit/test_dagcircuit.py b/test/python/dagcircuit/test_dagcircuit.py index b539ff3d5da3..9d73ac5a1af0 100644 --- a/test/python/dagcircuit/test_dagcircuit.py +++ b/test/python/dagcircuit/test_dagcircuit.py @@ -487,6 +487,18 @@ def test_apply_operation_back(self): self.assertEqual(len(list(self.dag.nodes())), 16) self.assertEqual(len(list(self.dag.edges())), 17) + def test_apply_operation_rejects_none(self): + """Test that the ``apply_operation_*`` methods warn when given ``None``.""" + noop = Instruction("noop", 0, 0, []) + with self.assertWarnsRegex(DeprecationWarning, "Passing 'None'"): + self.dag.apply_operation_back(noop, None, ()) + with self.assertWarnsRegex(DeprecationWarning, "Passing 'None'"): + self.dag.apply_operation_back(noop, (), None) + with self.assertWarnsRegex(DeprecationWarning, "Passing 'None'"): + self.dag.apply_operation_front(noop, None, ()) + with self.assertWarnsRegex(DeprecationWarning, "Passing 'None'"): + self.dag.apply_operation_front(noop, (), None) + def test_edges(self): """Test that DAGCircuit.edges() behaves as expected with ops.""" x_gate = XGate().c_if(*self.condition)