Skip to content

Commit d09c768

Browse files
Merge pull request RustPython#1544 from xarus01/master
Implemented range.__reduce__
2 parents 89566ee + aa27d22 commit d09c768

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

tests/snippets/builtin_range.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@
108108
assert list(reversed(range(5, 0, -1))) == [1, 2, 3, 4, 5]
109109
assert list(reversed(range(1,10,5))) == [6, 1]
110110

111+
# __reduce__
112+
assert range(10).__reduce__()[0] == range
113+
assert range(10).__reduce__()[1] == (0, 10, 1)
114+
assert range(10, 1, -2).__reduce__()[0] == range
115+
assert range(10, 1, -2).__reduce__()[1] == (10, 1, -2)
116+
111117
# range retains the original int refs
112118
i = 2**64
113119
assert range(i).stop is i

vm/src/obj/objrange.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use num_traits::{One, Signed, Zero};
77
use super::objint::{PyInt, PyIntRef};
88
use super::objiter;
99
use super::objslice::{PySlice, PySliceRef};
10+
use super::objtuple::PyTuple;
1011
use super::objtype::PyClassRef;
12+
1113
use crate::function::{OptionalArg, PyFuncArgs};
1214
use crate::pyhash;
1315
use crate::pyobject::{
@@ -298,6 +300,16 @@ impl PyRange {
298300
vm.ctx.not_implemented()
299301
}
300302

303+
#[pymethod(name = "__reduce__")]
304+
fn reduce(&self, vm: &VirtualMachine) -> (PyClassRef, PyTuple) {
305+
let range_paramters: Vec<PyObjectRef> = vec![&self.start, &self.stop, &self.step]
306+
.iter()
307+
.map(|x| x.as_object().clone())
308+
.collect();
309+
let range_paramters_tuple = PyTuple::from(range_paramters);
310+
(vm.ctx.range_type(), range_paramters_tuple)
311+
}
312+
301313
#[pymethod(name = "index")]
302314
fn index(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<BigInt> {
303315
if let Ok(int) = needle.downcast::<PyInt>() {

0 commit comments

Comments
 (0)