diff --git a/qiskit/providers/options.py b/qiskit/providers/options.py index 476d0a0d78da..d985fde4a195 100644 --- a/qiskit/providers/options.py +++ b/qiskit/providers/options.py @@ -80,6 +80,15 @@ def __setstate__(self, state): super().__setattr__("_fields", _fields) super().__setattr__("validator", validator) + def __copy__(self): + """Return a copy of the Options. + + The returned option and validator values are shallow copies of the originals. + """ + out = self.__new__(type(self)) + out.__setstate__((self._fields.copy(), self.validator.copy())) + return out + def __init__(self, **kwargs): super().__setattr__("_fields", kwargs) super().__setattr__("validator", {}) diff --git a/test/python/providers/test_options.py b/test/python/providers/test_options.py index e50e90458be7..3162ae766206 100644 --- a/test/python/providers/test_options.py +++ b/test/python/providers/test_options.py @@ -109,6 +109,17 @@ def test_hasattr(self): self.assertTrue(hasattr(options, "shots")) self.assertFalse(hasattr(options, "method")) + def test_copy(self): + options = Options(opt1=1, opt2=2) + cpy = copy.copy(options) + cpy.update_options(opt1=10, opt3=20) + self.assertEqual(options.opt1, 1) + self.assertEqual(options.opt2, 2) + self.assertNotIn("opt3", options) + self.assertEqual(cpy.opt1, 10) + self.assertEqual(cpy.opt2, 2) + self.assertEqual(cpy.opt3, 20) + class TestOptionsSimpleNamespaceBackwardCompatibility(QiskitTestCase): """Tests that SimpleNamespace-like functionality that qiskit-experiments relies on for Options