diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 4bcb73449..611c37628 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -181,8 +181,34 @@ impl PyTuple { } #[pymethod(name = "index")] - fn index(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { - for (index, element) in self.elements.iter().enumerate() { + fn index( + &self, + needle: PyObjectRef, + start: OptionalArg, + stop: OptionalArg, + vm: &VirtualMachine, + ) -> PyResult { + let mut start = start.into_option().unwrap_or(0); + if start < 0 { + start += self.borrow_value().len() as isize; + if start < 0 { + start = 0; + } + } + let mut stop = stop.into_option().unwrap_or(isize::MAX); + if stop < 0 { + stop += self.borrow_value().len() as isize; + if stop < 0 { + stop = 0; + } + } + for (index, element) in self + .elements + .iter() + .enumerate() + .take(stop as usize) + .skip(start as usize) + { if vm.identical_or_equal(element, &needle)? { return Ok(index); }