]> granicus.if.org Git - python/commitdiff
Give dict views a helpful __repr__.
authorRaymond Hettinger <python@rcn.com>
Tue, 3 Mar 2009 10:52:49 +0000 (10:52 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 3 Mar 2009 10:52:49 +0000 (10:52 +0000)
Lib/test/test_dict.py
Misc/NEWS
Objects/dictobject.c

index bfc31af0bee68c2f5664011a2c8113061720f2ac..308143da5b70c230af16f23201734e9bcec56382 100644 (file)
@@ -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 = {}
index d737f744493934801eb65adcce384f3fddcbc17c..0a7a53b72c6aa025fbb9246252f2f13f2bd91049 100644 (file)
--- 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.
 
index 10b6fd856a560789a2bb139c9a2997a1d1df2c95..e235993e9a6e92e4d8ea4a11f32706bb47dbc1be 100644 (file)
@@ -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 */