Skip to content

Commit 4d02a1e

Browse files
authored
Merge pull request RustPython#376 from veera83372/tuple-index
Added index to tuple
2 parents d3158f3 + 1479d6b commit 4d02a1e

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

tests/snippets/tuple.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@
1515

1616
assert y < x, "tuple __lt__ failed"
1717
assert x > y, "tuple __gt__ failed"
18+
19+
20+
b = (1,2,3)
21+
assert b.index(2) == 1

vm/src/obj/objtuple.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,21 @@ fn tuple_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
253253
get_item(vm, tuple, &get_elements(&tuple), needle.clone())
254254
}
255255

256+
pub fn tuple_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
257+
arg_check!(
258+
vm,
259+
args,
260+
required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)]
261+
);
262+
for (index, element) in get_elements(tuple).iter().enumerate() {
263+
let py_equal = vm.call_method(needle, "__eq__", vec![element.clone()])?;
264+
if objbool::get_value(&py_equal) {
265+
return Ok(vm.context().new_int(index));
266+
}
267+
}
268+
Err(vm.new_value_error("tuple.index(x): x not in tuple".to_string()))
269+
}
270+
256271
pub fn tuple_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
257272
arg_check!(
258273
vm,
@@ -298,4 +313,5 @@ pub fn init(context: &PyContext) {
298313
context.set_attr(&tuple_type, "__le__", context.new_rustfunc(tuple_le));
299314
context.set_attr(&tuple_type, "__gt__", context.new_rustfunc(tuple_gt));
300315
context.set_attr(&tuple_type, "__ge__", context.new_rustfunc(tuple_ge));
316+
context.set_attr(&tuple_type, "index", context.new_rustfunc(tuple_index));
301317
}

0 commit comments

Comments
 (0)