From b0d56afc84f4a7dacd8296e9203b051f019e2c3a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 3 Mar 2009 10:52:49 +0000 Subject: Give dict views a helpful __repr__. --- Lib/test/test_dict.py | 6 +++--- Misc/NEWS | 3 +++ Objects/dictobject.c | 21 ++++++++++++++++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index bfc31af..308143d 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -36,16 +36,16 @@ class DictTest(unittest.TestCase): k = d.keys() self.assert_('a' in d) self.assert_('b' in d) - self.assertRaises(TypeError, d.keys, None) + self.assertEqual(repr(dict(a=1).keys()), "dict_keys(['a'])") def test_values(self): d = {} self.assertEqual(set(d.values()), set()) d = {1:2} self.assertEqual(set(d.values()), {2}) - self.assertRaises(TypeError, d.values, None) + self.assertEqual(repr(dict(a=1).values()), "dict_values([1])") def test_items(self): d = {} @@ -53,8 +53,8 @@ class DictTest(unittest.TestCase): d = {1:2} self.assertEqual(set(d.items()), {(1, 2)}) - self.assertRaises(TypeError, d.items, None) + self.assertEqual(repr(dict(a=1).items()), "dict_items([('a', 1)])") def test_contains(self): d = {} diff --git a/Misc/NEWS b/Misc/NEWS index d737f74..0a7a53b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Core and Builtins ----------------- ======= + +- Give dict views an informative __repr__. + - Issue #5247: Improve error message when unknown format codes are used when using str.format() with str, int, and float arguments. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 10b6fd8..e235993 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2563,6 +2563,21 @@ dictview_richcompare(PyObject *self, PyObject *other, int op) 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 ***/ static PyObject * @@ -2700,7 +2715,7 @@ PyTypeObject PyDictKeys_Type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ - 0, /* tp_repr */ + (reprfunc)dictview_repr, /* tp_repr */ &dictviews_as_number, /* tp_as_number */ &dictkeys_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -2784,7 +2799,7 @@ PyTypeObject PyDictItems_Type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ - 0, /* tp_repr */ + (reprfunc)dictview_repr, /* tp_repr */ &dictviews_as_number, /* tp_as_number */ &dictitems_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -2849,7 +2864,7 @@ PyTypeObject PyDictValues_Type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ - 0, /* tp_repr */ + (reprfunc)dictview_repr, /* tp_repr */ 0, /* tp_as_number */ &dictvalues_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ -- cgit v0.12