Skip to content

Commit c2d6bef

Browse files
committed
Add rand, ror, rsub operators in dict_items, remove test annotation
1 parent cb87fa3 commit c2d6bef

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

Lib/test/test_dict.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,6 @@ def test_dictview_set_operations_on_keys(self):
659659
self.assertEqual(k1 ^ k2, {3})
660660
self.assertEqual(k1 ^ k3, {1,2,4})
661661

662-
# TODO: RUSTPYTHON
663-
@unittest.expectedFailure
664662
def test_dictview_set_operations_on_items(self):
665663
k1 = {1:1, 2:2}.items()
666664
k2 = {1:1, 2:2, 3:3}.items()

vm/src/builtins/dict.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,30 @@ impl PyDictItems {
926926
let inner = zelf.symmetric_difference(other, vm)?;
927927
Ok(PySet { inner })
928928
}
929+
930+
#[pymethod(name = "__rand__")]
931+
#[pymethod(magic)]
932+
fn and(zelf: PyRef<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
933+
let zelf = Self::to_set(zelf, vm)?;
934+
let inner = zelf.intersection(other, vm)?;
935+
Ok(PySet { inner })
936+
}
937+
938+
#[pymethod(name = "__ror__")]
939+
#[pymethod(magic)]
940+
fn or(zelf: PyRef<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
941+
let zelf = Self::to_set(zelf, vm)?;
942+
let inner = zelf.union(other, vm)?;
943+
Ok(PySet { inner })
944+
}
945+
946+
#[pymethod(name = "__rsub__")]
947+
#[pymethod(magic)]
948+
fn sub(zelf: PyRef<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
949+
let zelf = Self::to_set(zelf, vm)?;
950+
let inner = zelf.difference(other, vm)?;
951+
Ok(PySet { inner })
952+
}
929953
}
930954

931955
pub(crate) fn init(context: &PyContext) {

vm/src/builtins/set.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl PySetInner {
126126
Ok(true)
127127
}
128128

129-
fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
129+
pub(super) fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
130130
let set = self.clone();
131131
for item in other.iter(vm)? {
132132
set.add(item?, vm)?;
@@ -135,7 +135,11 @@ impl PySetInner {
135135
Ok(set)
136136
}
137137

138-
fn intersection(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
138+
pub(super) fn intersection(
139+
&self,
140+
other: ArgIterable,
141+
vm: &VirtualMachine,
142+
) -> PyResult<PySetInner> {
139143
let set = PySetInner::default();
140144
for item in other.iter(vm)? {
141145
let obj = item?;
@@ -146,7 +150,11 @@ impl PySetInner {
146150
Ok(set)
147151
}
148152

149-
fn difference(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
153+
pub(super) fn difference(
154+
&self,
155+
other: ArgIterable,
156+
vm: &VirtualMachine,
157+
) -> PyResult<PySetInner> {
150158
let set = self.copy();
151159
for item in other.iter(vm)? {
152160
set.content.delete_if_exists(vm, &item?)?;

0 commit comments

Comments
 (0)