From d891c87c4f09479aef7861ea0e237ed9daa75a4a Mon Sep 17 00:00:00 2001 From: coolreader18 <33094578+coolreader18@users.noreply.github.com> Date: Sat, 6 Jul 2019 23:29:31 -0500 Subject: [PATCH] Add maxlen as a named arg --- tests/snippets/test_collections.py | 4 ++++ vm/src/stdlib/collections.rs | 22 +++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/tests/snippets/test_collections.py b/tests/snippets/test_collections.py index 820123c43..8b44cefdb 100644 --- a/tests/snippets/test_collections.py +++ b/tests/snippets/test_collections.py @@ -31,3 +31,7 @@ assert d == deque([], 4) assert deque([1, 2, 3]) * 2 == deque([1, 2, 3, 1, 2, 3]) assert deque([1, 2, 3], 4) * 2 == deque([3, 1, 2, 3]) + +assert deque(maxlen=3) == deque() + +assert deque([1, 2, 3, 4], maxlen=2) == deque([3, 4]) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 587d5ba1c..9b3013e9c 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -20,25 +20,29 @@ impl PyValue for PyDeque { } } +#[derive(FromArgs)] +struct PyDequeOptions { + #[pyarg(positional_or_keyword, default = "None")] + maxlen: Option, +} + #[pyimpl] impl PyDeque { #[pymethod(name = "__new__")] fn new( cls: PyClassRef, iter: OptionalArg, - maxlen: OptionalArg>, + PyDequeOptions { maxlen }: PyDequeOptions, vm: &VirtualMachine, ) -> PyResult> { - let deque = if let OptionalArg::Present(iter) = iter { - iter.iter(vm)?.collect::>()? - } else { - VecDeque::new() + let py_deque = PyDeque { + deque: RefCell::default(), + maxlen: maxlen.into(), }; - PyDeque { - deque: RefCell::new(deque), - maxlen: maxlen.into_option().and_then(|x| x).into(), + if let OptionalArg::Present(iter) = iter { + py_deque.extend(iter, vm)?; } - .into_ref_with_type(vm, cls) + py_deque.into_ref_with_type(vm, cls) } #[pymethod]