diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 0d9ac1fc0..45ebdc846 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -172,7 +172,6 @@ class TestJointOps: else: self.fail("s-t did not screen-out general iterables") - @unittest.skip("TODO: RUSTPYTHON") def test_symmetric_difference(self): i = self.s.symmetric_difference(self.otherword) for c in self.letters: @@ -187,7 +186,6 @@ class TestJointOps: self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a')) self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef')) - @unittest.skip("TODO: RUSTPYTHON") def test_xor(self): i = self.s.symmetric_difference(self.otherword) self.assertEqual(self.s ^ set(self.otherword), i) @@ -582,7 +580,6 @@ class TestSet(TestJointOps, unittest.TestCase): else: self.assertNotIn(c, self.s) - @unittest.skip("TODO: RUSTPYTHON") def test_symmetric_difference_update(self): retval = self.s.symmetric_difference_update(self.otherword) self.assertEqual(retval, None) diff --git a/vm/src/obj/objset.rs b/vm/src/obj/objset.rs index 1483a8a3d..bf9c2c2ed 100644 --- a/vm/src/obj/objset.rs +++ b/vm/src/obj/objset.rs @@ -206,8 +206,11 @@ impl PySetInner { fn symmetric_difference(&self, other: PyIterable, vm: &VirtualMachine) -> PyResult { let mut new_inner = self.clone(); - for item in other.iter(vm)? { - new_inner.content.delete_or_insert(vm, &item?, ())? + // We want to remove duplicates in other + let other_set = Self::new(other, vm)?; + + for item in other_set.content.keys() { + new_inner.content.delete_or_insert(vm, &item, ())? } Ok(new_inner) @@ -322,8 +325,10 @@ impl PySetInner { vm: &VirtualMachine, ) -> PyResult<()> { for iterable in others { - for item in iterable.iter(vm)? { - self.content.delete_or_insert(vm, &item?, ())?; + // We want to remove duplicates in iterable + let iterable_set = Self::new(iterable, vm)?; + for item in iterable_set.content.keys() { + self.content.delete_or_insert(vm, &item, ())?; } } Ok(())