Merge pull request #1717 from palaviv/dict_iterator-repr

Add repr for dict_keys, dict_values and dict_items
This commit is contained in:
Aviv Palivoda
2020-01-30 14:45:23 +02:00
committed by GitHub
2 changed files with 19 additions and 6 deletions

View File

@@ -45,7 +45,6 @@ class DictTest(unittest.TestCase):
self.assertIs(bool({}), False)
self.assertIs(bool({1: 2}), True)
@unittest.skip("TODO: RUSTPYTHON")
def test_keys(self):
d = {}
self.assertEqual(set(d.keys()), set())
@@ -59,7 +58,6 @@ class DictTest(unittest.TestCase):
self.assertRaises(TypeError, d.keys, None)
self.assertEqual(repr(dict(a=1).keys()), "dict_keys(['a'])")
@unittest.skip("TODO: RUSTPYTHON")
def test_values(self):
d = {}
self.assertEqual(set(d.values()), set())
@@ -68,7 +66,6 @@ class DictTest(unittest.TestCase):
self.assertRaises(TypeError, d.values, None)
self.assertEqual(repr(dict(a=1).values()), "dict_values([1])")
@unittest.skip("TODO: RUSTPYTHON")
def test_items(self):
d = {}
self.assertEqual(set(d.items()), set())

View File

@@ -516,6 +516,22 @@ macro_rules! dict_iterator {
fn len(&self, vm: &VirtualMachine) -> usize {
self.dict.clone().len(vm)
}
#[pymethod(name = "__repr__")]
#[allow(clippy::redundant_closure_call)]
fn repr(zelf: PyRef<Self>, vm: &VirtualMachine) -> PyResult<String> {
let s = if let Some(_guard) = ReprGuard::enter(zelf.as_object()) {
let mut str_parts = vec![];
for (key, value) in zelf.dict.clone() {
let s = vm.to_repr(&$result_fn(vm, &key, &value))?;
str_parts.push(s.as_str().to_string());
}
format!("{}([{}])", $class_name, str_parts.join(", "))
} else {
"{...}".to_string()
};
Ok(s)
}
}
impl PyValue for $name {
@@ -589,7 +605,7 @@ dict_iterator! {
PyDictKeyIterator,
dictkeys_type,
dictkeyiterator_type,
"dictkeys",
"dict_keys",
"dictkeyiterator",
|_vm: &VirtualMachine, key: &PyObjectRef, _value: &PyObjectRef| key.clone()
}
@@ -599,7 +615,7 @@ dict_iterator! {
PyDictValueIterator,
dictvalues_type,
dictvalueiterator_type,
"dictvalues",
"dict_values",
"dictvalueiterator",
|_vm: &VirtualMachine, _key: &PyObjectRef, value: &PyObjectRef| value.clone()
}
@@ -609,7 +625,7 @@ dict_iterator! {
PyDictItemIterator,
dictitems_type,
dictitemiterator_type,
"dictitems",
"dict_items",
"dictitemiterator",
|vm: &VirtualMachine, key: &PyObjectRef, value: &PyObjectRef|
vm.ctx.new_tuple(vec![key.clone(), value.clone()])