Commit b0d56afc authored by Raymond Hettinger's avatar Raymond Hettinger

Give dict views a helpful __repr__.

parent ce57cdbe
...@@ -36,16 +36,16 @@ class DictTest(unittest.TestCase): ...@@ -36,16 +36,16 @@ class DictTest(unittest.TestCase):
k = d.keys() k = d.keys()
self.assert_('a' in d) self.assert_('a' in d)
self.assert_('b' in d) self.assert_('b' in d)
self.assertRaises(TypeError, d.keys, None) self.assertRaises(TypeError, d.keys, None)
self.assertEqual(repr(dict(a=1).keys()), "dict_keys(['a'])")
def test_values(self): def test_values(self):
d = {} d = {}
self.assertEqual(set(d.values()), set()) self.assertEqual(set(d.values()), set())
d = {1:2} d = {1:2}
self.assertEqual(set(d.values()), {2}) self.assertEqual(set(d.values()), {2})
self.assertRaises(TypeError, d.values, None) self.assertRaises(TypeError, d.values, None)
self.assertEqual(repr(dict(a=1).values()), "dict_values([1])")
def test_items(self): def test_items(self):
d = {} d = {}
...@@ -53,8 +53,8 @@ class DictTest(unittest.TestCase): ...@@ -53,8 +53,8 @@ class DictTest(unittest.TestCase):
d = {1:2} d = {1:2}
self.assertEqual(set(d.items()), {(1, 2)}) self.assertEqual(set(d.items()), {(1, 2)})
self.assertRaises(TypeError, d.items, None) self.assertRaises(TypeError, d.items, None)
self.assertEqual(repr(dict(a=1).items()), "dict_items([('a', 1)])")
def test_contains(self): def test_contains(self):
d = {} d = {}
......
...@@ -13,6 +13,9 @@ Core and Builtins ...@@ -13,6 +13,9 @@ Core and Builtins
----------------- -----------------
======= =======
- Give dict views an informative __repr__.
- Issue #5247: Improve error message when unknown format codes are - Issue #5247: Improve error message when unknown format codes are
used when using str.format() with str, int, and float arguments. used when using str.format() with str, int, and float arguments.
......
...@@ -2563,6 +2563,21 @@ dictview_richcompare(PyObject *self, PyObject *other, int op) ...@@ -2563,6 +2563,21 @@ dictview_richcompare(PyObject *self, PyObject *other, int op)
return result; return result;
} }
static PyObject *
dictview_repr(dictviewobject *dv)
{
PyObject *seq;
PyObject *result;
seq = PySequence_List((PyObject *)dv);
if (seq == NULL)
return NULL;
result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq);
Py_DECREF(seq);
return result;
}
/*** dict_keys ***/ /*** dict_keys ***/
static PyObject * static PyObject *
...@@ -2700,7 +2715,7 @@ PyTypeObject PyDictKeys_Type = { ...@@ -2700,7 +2715,7 @@ PyTypeObject PyDictKeys_Type = {
0, /* tp_getattr */ 0, /* tp_getattr */
0, /* tp_setattr */ 0, /* tp_setattr */
0, /* tp_reserved */ 0, /* tp_reserved */
0, /* tp_repr */ (reprfunc)dictview_repr, /* tp_repr */
&dictviews_as_number, /* tp_as_number */ &dictviews_as_number, /* tp_as_number */
&dictkeys_as_sequence, /* tp_as_sequence */ &dictkeys_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
...@@ -2784,7 +2799,7 @@ PyTypeObject PyDictItems_Type = { ...@@ -2784,7 +2799,7 @@ PyTypeObject PyDictItems_Type = {
0, /* tp_getattr */ 0, /* tp_getattr */
0, /* tp_setattr */ 0, /* tp_setattr */
0, /* tp_reserved */ 0, /* tp_reserved */
0, /* tp_repr */ (reprfunc)dictview_repr, /* tp_repr */
&dictviews_as_number, /* tp_as_number */ &dictviews_as_number, /* tp_as_number */
&dictitems_as_sequence, /* tp_as_sequence */ &dictitems_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
...@@ -2849,7 +2864,7 @@ PyTypeObject PyDictValues_Type = { ...@@ -2849,7 +2864,7 @@ PyTypeObject PyDictValues_Type = {
0, /* tp_getattr */ 0, /* tp_getattr */
0, /* tp_setattr */ 0, /* tp_setattr */
0, /* tp_reserved */ 0, /* tp_reserved */
0, /* tp_repr */ (reprfunc)dictview_repr, /* tp_repr */
0, /* tp_as_number */ 0, /* tp_as_number */
&dictvalues_as_sequence, /* tp_as_sequence */ &dictvalues_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment