Add rand, ror, rsub operators in dict_items, remove test annotation

This commit is contained in:
joohongpark
2021-10-08 02:10:24 +09:00
parent cb87fa3562
commit c2d6bef793
3 changed files with 35 additions and 5 deletions

View File

@@ -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()

View File

@@ -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<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
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<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
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<Self>, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySet> {
let zelf = Self::to_set(zelf, vm)?;
let inner = zelf.difference(other, vm)?;
Ok(PySet { inner })
}
}
pub(crate) fn init(context: &PyContext) {

View File

@@ -126,7 +126,7 @@ impl PySetInner {
Ok(true)
}
fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
pub(super) fn union(&self, other: ArgIterable, vm: &VirtualMachine) -> PyResult<PySetInner> {
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<PySetInner> {
pub(super) fn intersection(
&self,
other: ArgIterable,
vm: &VirtualMachine,
) -> PyResult<PySetInner> {
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<PySetInner> {
pub(super) fn difference(
&self,
other: ArgIterable,
vm: &VirtualMachine,
) -> PyResult<PySetInner> {
let set = self.copy();
for item in other.iter(vm)? {
set.content.delete_if_exists(vm, &item?)?;