Skip to content

Commit d891c87

Browse files
committed
Add maxlen as a named arg
1 parent 9d3fa18 commit d891c87

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

tests/snippets/test_collections.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,7 @@
3131
assert deque([1, 2, 3]) * 2 == deque([1, 2, 3, 1, 2, 3])
3232

3333
assert deque([1, 2, 3], 4) * 2 == deque([3, 1, 2, 3])
34+
35+
assert deque(maxlen=3) == deque()
36+
37+
assert deque([1, 2, 3, 4], maxlen=2) == deque([3, 4])

vm/src/stdlib/collections.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,29 @@ impl PyValue for PyDeque {
2020
}
2121
}
2222

23+
#[derive(FromArgs)]
24+
struct PyDequeOptions {
25+
#[pyarg(positional_or_keyword, default = "None")]
26+
maxlen: Option<usize>,
27+
}
28+
2329
#[pyimpl]
2430
impl PyDeque {
2531
#[pymethod(name = "__new__")]
2632
fn new(
2733
cls: PyClassRef,
2834
iter: OptionalArg<PyIterable>,
29-
maxlen: OptionalArg<Option<usize>>,
35+
PyDequeOptions { maxlen }: PyDequeOptions,
3036
vm: &VirtualMachine,
3137
) -> PyResult<PyRef<Self>> {
32-
let deque = if let OptionalArg::Present(iter) = iter {
33-
iter.iter(vm)?.collect::<Result<_, _>>()?
34-
} else {
35-
VecDeque::new()
38+
let py_deque = PyDeque {
39+
deque: RefCell::default(),
40+
maxlen: maxlen.into(),
3641
};
37-
PyDeque {
38-
deque: RefCell::new(deque),
39-
maxlen: maxlen.into_option().and_then(|x| x).into(),
42+
if let OptionalArg::Present(iter) = iter {
43+
py_deque.extend(iter, vm)?;
4044
}
41-
.into_ref_with_type(vm, cls)
45+
py_deque.into_ref_with_type(vm, cls)
4246
}
4347

4448
#[pymethod]

0 commit comments

Comments
 (0)