diff --git a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py index 95162ebe247d..cee5300049e4 100644 --- a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +++ b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py @@ -235,6 +235,14 @@ def paulis(self): def paulis(self, value): if not isinstance(value, PauliList): value = PauliList(value) + if value.num_qubits != self.num_qubits: + raise ValueError( + f"incorrect number of qubits: expected {self.num_qubits}, got {value.num_qubits}" + ) + if len(value) != len(self.paulis): + raise ValueError( + f"incorrect number of operators: expected {len(self.paulis)}, got {len(value)}" + ) self._pauli_list = value @property diff --git a/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml b/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml new file mode 100644 index 000000000000..86d4b552ffe4 --- /dev/null +++ b/releasenotes/notes/sparse-pauli-op-constraint-pauli-setter-52f6f89627d1937c.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + The setter for :attr:`.SparsePauliOp.paulis` will now correctly reject attempts to set the + attribute with incorrectly shaped data, rather than silently allowing an invalid object to be + created. See `#10384 `__. diff --git a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py index be066453a78d..767153e23883 100644 --- a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py +++ b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py @@ -1015,6 +1015,14 @@ def test_assign_parameters(self): with self.subTest(msg="fully bound"): self.assertTrue(np.allclose(bound.coeffs.astype(complex), [1, 3, 6])) + def test_paulis_setter_rejects_bad_inputs(self): + """Test that the setter for `paulis` rejects different-sized inputs.""" + op = SparsePauliOp(["XY", "ZX"], coeffs=[1, 1j]) + with self.assertRaisesRegex(ValueError, "incorrect number of qubits"): + op.paulis = PauliList([Pauli("X"), Pauli("Y")]) + with self.assertRaisesRegex(ValueError, "incorrect number of operators"): + op.paulis = PauliList([Pauli("XY"), Pauli("ZX"), Pauli("YZ")]) + if __name__ == "__main__": unittest.main()