Skip to content

Commit 21b6616

Browse files
committed
Add set.symmetric_difference_update
1 parent 1621d78 commit 21b6616

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

tests/snippets/set.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,8 @@ def __hash__(self):
108108
a.difference_update([3,4,5])
109109
assert a == set([1,2])
110110
assert_raises(TypeError, lambda: a.difference_update(1))
111+
112+
a = set([1,2,3])
113+
a.symmetric_difference_update([3,4,5])
114+
assert a == set([1,2,4,5])
115+
assert_raises(TypeError, lambda: a.difference_update(1))

vm/src/obj/objset.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,35 @@ fn set_combine_update_inner(
492492
}
493493
}
494494

495+
fn set_symmetric_difference_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
496+
arg_check!(
497+
vm,
498+
args,
499+
required = [(zelf, Some(vm.ctx.set_type())), (iterable, None)]
500+
);
501+
502+
let mut mut_obj = zelf.borrow_mut();
503+
504+
match mut_obj.payload {
505+
PyObjectPayload::Set { ref mut elements } => {
506+
let elements_original = elements.clone();
507+
let iterator = objiter::get_iter(vm, iterable)?;
508+
while let Ok(v) = vm.call_method(&iterator, "__next__", vec![]) {
509+
insert_into_set(vm, elements, &v)?;
510+
}
511+
for element in elements_original.iter() {
512+
let value = vm.call_method(iterable, "__contains__", vec![element.1.clone()])?;
513+
if objbool::get_value(&value) {
514+
elements.remove(&element.0.clone());
515+
}
516+
}
517+
518+
Ok(vm.get_none())
519+
}
520+
_ => Err(vm.new_type_error("".to_string())),
521+
}
522+
}
523+
495524
fn frozenset_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
496525
arg_check!(vm, args, required = [(o, Some(vm.ctx.frozenset_type()))]);
497526

@@ -574,6 +603,11 @@ pub fn init(context: &PyContext) {
574603
"difference_update",
575604
context.new_rustfunc(set_difference_update),
576605
);
606+
context.set_attr(
607+
&set_type,
608+
"symmetric_difference_update",
609+
context.new_rustfunc(set_symmetric_difference_update),
610+
);
577611

578612
let frozenset_type = &context.frozenset_type;
579613

0 commit comments

Comments
 (0)