Skip to content

Commit 2ac195e

Browse files
committed
List remove, handle non exist element. Add new test
1 parent 358f9f7 commit 2ac195e

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

tests/snippets/builtin_enumerate.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55
assert list(enumerate(['a', 'b', 'c'], -100)) == [(-100, 'a'), (-99, 'b'), (-98, 'c')]
66
assert list(enumerate(['a', 'b', 'c'], 2**200)) == [(2**200, 'a'), (2**200 + 1, 'b'), (2**200 + 2, 'c')]
77

8+
a = list([1, 2, 3])
9+
assert len(a) == 3
10+
a.remove(1)
11+
assert len(a) == 2
12+
assert not 1 in a
13+
14+
try:
15+
a.remove(10)
16+
except ValueError:
17+
pass
18+
else:
19+
assert False, "Remove not exist element should raise ValueError"
20+
821

922
# test infinite iterator
1023
class Counter(object):

vm/src/obj/objlist.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,9 +417,16 @@ fn list_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
417417
);
418418

419419
let mut elements = get_mut_elements(list);
420-
let i = elements.iter().position(|r| objbool::get_value(&vm._eq(needle.clone(), r.clone()).unwrap())).unwrap();
421-
elements.remove(i);
422-
Ok(vm.get_none())
420+
let i = elements
421+
.iter()
422+
.position(|r| objbool::get_value(&vm._eq(needle.clone(), r.clone()).unwrap()));
423+
if i.is_some() {
424+
elements.remove(i.unwrap());
425+
Ok(vm.get_none())
426+
} else {
427+
let needle_str = objstr::get_value(&vm.to_str(needle).unwrap());
428+
Err(vm.new_value_error(format!("'{}' is not in list", needle_str)))
429+
}
423430
}
424431

425432
pub fn init(context: &PyContext) {

0 commit comments

Comments
 (0)