Skip to content

Commit 0000551

Browse files
authored
Merge pull request RustPython#608 from palaviv/dict-methods
Add dict.{keys,values,items}
2 parents 06e17af + 24dcc06 commit 0000551

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

tests/snippets/dict.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,20 @@ 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 value in a.values():
24+
res.add(value)
25+
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)
32+
33+
res = set()
34+
for key in a.keys():
35+
res.add(key)
36+
assert res == set(['a','b'])

vm/src/obj/objdict.rs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
243243
arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
244244

245245
let keys = get_elements(dict)
246-
.keys()
247-
.map(|k| vm.ctx.new_str(k.to_string()))
246+
.values()
247+
.map(|(k, _v)| k.clone())
248248
.collect();
249249
let key_list = vm.ctx.new_list(keys);
250250

@@ -259,6 +259,46 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
259259
Ok(iter_obj)
260260
}
261261

262+
fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
263+
arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
264+
265+
let values = get_elements(dict)
266+
.values()
267+
.map(|(_k, v)| v.clone())
268+
.collect();
269+
let values_list = vm.ctx.new_list(values);
270+
271+
let iter_obj = PyObject::new(
272+
PyObjectPayload::Iterator {
273+
position: Cell::new(0),
274+
iterated_obj: values_list,
275+
},
276+
vm.ctx.iter_type(),
277+
);
278+
279+
Ok(iter_obj)
280+
}
281+
282+
fn dict_items(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
283+
arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
284+
285+
let items = get_elements(dict)
286+
.values()
287+
.map(|(k, v)| vm.ctx.new_tuple(vec![k.clone(), v.clone()]))
288+
.collect();
289+
let items_list = vm.ctx.new_list(items);
290+
291+
let iter_obj = PyObject::new(
292+
PyObjectPayload::Iterator {
293+
position: Cell::new(0),
294+
iterated_obj: items_list,
295+
},
296+
vm.ctx.iter_type(),
297+
);
298+
299+
Ok(iter_obj)
300+
}
301+
262302
fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
263303
arg_check!(
264304
vm,
@@ -336,4 +376,7 @@ pub fn init(context: &PyContext) {
336376
context.new_rustfunc(dict_setitem),
337377
);
338378
context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear));
379+
context.set_attr(&dict_type, "values", context.new_rustfunc(dict_values));
380+
context.set_attr(&dict_type, "items", context.new_rustfunc(dict_items));
381+
context.set_attr(&dict_type, "keys", context.new_rustfunc(dict_iter));
339382
}

0 commit comments

Comments
 (0)