Skip to content

Commit 475476d

Browse files
committed
Add dict.items
1 parent 37118c7 commit 475476d

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

tests/snippets/dict.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ def dict_eq(d1, d2):
2020

2121
a = {'a': 5, 'b': 6}
2222
res = set()
23-
for num in a.values():
24-
res.add(num)
23+
for value in a.values():
24+
res.add(value)
2525
assert res == set([5,6])
26+
27+
count = 0
28+
for (key, value) in a.items():
29+
assert a[key] == value
30+
count += 1
31+
assert count == len(a)

vm/src/obj/objdict.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,7 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
273273

274274
let values = get_elements(dict)
275275
.values()
276-
.map(|(_k, v)| v)
277-
.cloned()
276+
.map(|(_k, v)| v.clone())
278277
.collect();
279278
let values_list = vm.ctx.new_list(values);
280279

@@ -289,6 +288,26 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
289288
Ok(iter_obj)
290289
}
291290

291+
fn dict_items(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
292+
arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
293+
294+
let items = get_elements(dict)
295+
.values()
296+
.map(|(k, v)| vm.ctx.new_tuple(vec![k.clone(), v.clone()]))
297+
.collect();
298+
let items_list = vm.ctx.new_list(items);
299+
300+
let iter_obj = PyObject::new(
301+
PyObjectPayload::Iterator {
302+
position: Cell::new(0),
303+
iterated_obj: items_list,
304+
},
305+
vm.ctx.iter_type(),
306+
);
307+
308+
Ok(iter_obj)
309+
}
310+
292311
fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
293312
arg_check!(
294313
vm,
@@ -367,4 +386,5 @@ pub fn init(context: &PyContext) {
367386
);
368387
context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear));
369388
context.set_attr(&dict_type, "values", context.new_rustfunc(dict_values));
389+
context.set_attr(&dict_type, "items", context.new_rustfunc(dict_items));
370390
}

0 commit comments

Comments
 (0)