diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 2ecb91d44..07c57e2d5 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -659,8 +659,6 @@ class DictTest(unittest.TestCase): self.assertEqual(k1 ^ k2, {3}) self.assertEqual(k1 ^ k3, {1,2,4}) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_dictview_set_operations_on_items(self): k1 = {1:1, 2:2}.items() k2 = {1:1, 2:2, 3:3}.items() diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index c04332d69..fe25dd9cb 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -926,6 +926,30 @@ impl PyDictItems { let inner = zelf.symmetric_difference(other, vm)?; Ok(PySet { inner }) } + + #[pymethod(name = "__rand__")] + #[pymethod(magic)] + fn and(zelf: PyRef, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + let zelf = Self::to_set(zelf, vm)?; + let inner = zelf.intersection(other, vm)?; + Ok(PySet { inner }) + } + + #[pymethod(name = "__ror__")] + #[pymethod(magic)] + fn or(zelf: PyRef, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + let zelf = Self::to_set(zelf, vm)?; + let inner = zelf.union(other, vm)?; + Ok(PySet { inner }) + } + + #[pymethod(name = "__rsub__")] + #[pymethod(magic)] + fn sub(zelf: PyRef, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + let zelf = Self::to_set(zelf, vm)?; + let inner = zelf.difference(other, vm)?; + Ok(PySet { inner }) + } } pub(crate) fn init(context: &PyContext) { diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index 868c72aae..1f62207c2 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -126,7 +126,7 @@ impl PySetInner { Ok(true) } - fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + pub(super) fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult { let set = self.clone(); for item in other.iter(vm)? { set.add(item?, vm)?; @@ -135,7 +135,11 @@ impl PySetInner { Ok(set) } - fn intersection(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + pub(super) fn intersection( + &self, + other: ArgIterable, + vm: &VirtualMachine, + ) -> PyResult { let set = PySetInner::default(); for item in other.iter(vm)? { let obj = item?; @@ -146,7 +150,11 @@ impl PySetInner { Ok(set) } - fn difference(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult { + pub(super) fn difference( + &self, + other: ArgIterable, + vm: &VirtualMachine, + ) -> PyResult { let set = self.copy(); for item in other.iter(vm)? { set.content.delete_if_exists(vm, &item?)?;