Skip to content

Commit 37118c7

Browse files
committed
Add dict.values
1 parent d278fb8 commit 37118c7

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

tests/snippets/dict.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,9 @@ def dict_eq(d1, d2):
1717

1818
a.clear()
1919
assert len(a) == 0
20+
21+
a = {'a': 5, 'b': 6}
22+
res = set()
23+
for num in a.values():
24+
res.add(num)
25+
assert res == set([5,6])

vm/src/obj/objdict.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,27 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
268268
Ok(iter_obj)
269269
}
270270

271+
fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
272+
arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
273+
274+
let values = get_elements(dict)
275+
.values()
276+
.map(|(_k, v)| v)
277+
.cloned()
278+
.collect();
279+
let values_list = vm.ctx.new_list(values);
280+
281+
let iter_obj = PyObject::new(
282+
PyObjectPayload::Iterator {
283+
position: Cell::new(0),
284+
iterated_obj: values_list,
285+
},
286+
vm.ctx.iter_type(),
287+
);
288+
289+
Ok(iter_obj)
290+
}
291+
271292
fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
272293
arg_check!(
273294
vm,
@@ -345,4 +366,5 @@ pub fn init(context: &PyContext) {
345366
context.new_rustfunc(dict_setitem),
346367
);
347368
context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear));
369+
context.set_attr(&dict_type, "values", context.new_rustfunc(dict_values));
348370
}

0 commit comments

Comments
 (0)