Skip to content

Commit 4762d65

Browse files
committed
implement set.discard
1 parent 2d22a88 commit 4762d65

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

tests/snippets/set.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,8 @@ def __hash__(self):
8383
else:
8484
assert False, "TypeError was not raised"
8585

86+
a = set([1, 2, 3])
87+
assert a.discard(1) is None
88+
assert not 1 in a
89+
90+
assert a.discard(42) is None

vm/src/obj/objset.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ fn set_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
101101
}
102102
}
103103

104+
fn set_discard(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
105+
trace!("set.discard called with: {:?}", args);
106+
arg_check!(
107+
vm,
108+
args,
109+
required = [(s, Some(vm.ctx.set_type())), (item, None)]
110+
);
111+
let mut mut_obj = s.borrow_mut();
112+
113+
match mut_obj.payload {
114+
PyObjectPayload::Set { ref mut elements } => {
115+
fn discard(
116+
vm: &mut VirtualMachine,
117+
elements: &mut HashMap<u64, PyObjectRef>,
118+
key: u64,
119+
_value: &PyObjectRef,
120+
) -> PyResult {
121+
elements.remove(&key);
122+
Ok(vm.get_none())
123+
}
124+
perform_action_with_hash(vm, elements, item, &discard)
125+
}
126+
_ => Err(vm.new_type_error("set.discard is called with no item".to_string())),
127+
}
128+
}
129+
104130
fn set_clear(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
105131
trace!("set.clear called");
106132
arg_check!(vm, args, required = [(s, Some(vm.ctx.set_type()))]);
@@ -449,6 +475,7 @@ pub fn init(context: &PyContext) {
449475
context.set_attr(&set_type, "__doc__", context.new_str(set_doc.to_string()));
450476
context.set_attr(&set_type, "add", context.new_rustfunc(set_add));
451477
context.set_attr(&set_type, "remove", context.new_rustfunc(set_remove));
478+
context.set_attr(&set_type, "discard", context.new_rustfunc(set_discard));
452479
context.set_attr(&set_type, "clear", context.new_rustfunc(set_clear));
453480

454481
let frozenset_type = &context.frozenset_type;

0 commit comments

Comments
 (0)