]> granicus.if.org Git - python/commitdiff
Endow dict views with a proper length method.
authorGuido van Rossum <guido@python.org>
Sat, 10 Feb 2007 04:54:19 +0000 (04:54 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 10 Feb 2007 04:54:19 +0000 (04:54 +0000)
Lib/test/test_dictviews.py
Objects/dictobject.c

index 15c933fcee1bebb99edce0f799298618492fc653..c0c1da1bf25b42f12bef6732abdb98b0c974089b 100644 (file)
@@ -7,16 +7,19 @@ class DictSetTest(unittest.TestCase):
         d = {1: 10, "a": "ABC"}
         keys = d.KEYS()
         self.assertEqual(set(keys), {1, "a"})
+        self.assertEqual(len(keys), 2)
 
     def test_dict_items(self):
         d = {1: 10, "a": "ABC"}
         items = d.ITEMS()
         self.assertEqual(set(items), {(1, 10), ("a", "ABC")})
+        self.assertEqual(len(items), 2)
 
     def test_dict_values(self):
         d = {1: 10, "a": "ABC"}
         values = d.VALUES()
         self.assertEqual(set(values), {10, "ABC"})
+        self.assertEqual(len(values), 2)
 
 def test_main():
     test_support.run_unittest(DictSetTest)
index bb527ddc3f571078f267c63099f6e71854f6a884..e2e98db02f1e5dfad885684a341e25da06ce1284 100644 (file)
@@ -2354,13 +2354,13 @@ dictview_dealloc(dictviewobject *ds)
        PyObject_Del(ds);
 }
 
-static PyObject *
-dictview_length_hint(dictviewobject *ds)
+static Py_ssize_t
+dictview_len(dictviewobject *ds)
 {
        Py_ssize_t len = 0;
        if (ds->ds_dict != NULL)
                len = ds->ds_dict->ma_used;
-       return PyInt_FromSize_t(len);
+       return len;
 }
 
 static PyObject *
@@ -2397,9 +2397,18 @@ dictkeys_iter(dictviewobject *ds)
        return dictiter_new(ds->ds_dict, &PyDictIterKey_Type);
 }
 
+static PySequenceMethods dictkeys_as_sequence = {
+       (lenfunc)dictview_len,          /* sq_length */
+       0,                              /* sq_concat */
+       0,                              /* sq_repeat */
+       0,                              /* sq_item */
+       0,                              /* sq_slice */
+       0,                              /* sq_ass_item */
+       0,                              /* sq_ass_slice */
+       (objobjproc)0,                  /* sq_contains */
+};
+
 static PyMethodDef dictkeys_methods[] = {
-       {"__length_hint__", (PyCFunction)dictview_length_hint, METH_NOARGS,
-         length_hint_doc},
        {NULL,          NULL}           /* sentinel */
 };
 
@@ -2417,7 +2426,7 @@ PyTypeObject PyDictKeys_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &dictkeys_as_sequence,                  /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */
@@ -2454,9 +2463,18 @@ dictitems_iter(dictviewobject *ds)
        return dictiter_new(ds->ds_dict, &PyDictIterItem_Type);
 }
 
+static PySequenceMethods dictitems_as_sequence = {
+       (lenfunc)dictview_len,          /* sq_length */
+       0,                              /* sq_concat */
+       0,                              /* sq_repeat */
+       0,                              /* sq_item */
+       0,                              /* sq_slice */
+       0,                              /* sq_ass_item */
+       0,                              /* sq_ass_slice */
+       (objobjproc)0,                  /* sq_contains */
+};
+
 static PyMethodDef dictitems_methods[] = {
-       {"__length_hint__", (PyCFunction)dictview_length_hint, METH_NOARGS,
-         length_hint_doc},
        {NULL,          NULL}           /* sentinel */
 };
 
@@ -2474,7 +2492,7 @@ PyTypeObject PyDictItems_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &dictitems_as_sequence,                 /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */
@@ -2511,9 +2529,18 @@ dictvalues_iter(dictviewobject *ds)
        return dictiter_new(ds->ds_dict, &PyDictIterValue_Type);
 }
 
+static PySequenceMethods dictvalues_as_sequence = {
+       (lenfunc)dictview_len,          /* sq_length */
+       0,                              /* sq_concat */
+       0,                              /* sq_repeat */
+       0,                              /* sq_item */
+       0,                              /* sq_slice */
+       0,                              /* sq_ass_item */
+       0,                              /* sq_ass_slice */
+       (objobjproc)0,                  /* sq_contains */
+};
+
 static PyMethodDef dictvalues_methods[] = {
-       {"__length_hint__", (PyCFunction)dictview_length_hint, METH_NOARGS,
-         length_hint_doc},
        {NULL,          NULL}           /* sentinel */
 };
 
@@ -2531,7 +2558,7 @@ PyTypeObject PyDictValues_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &dictvalues_as_sequence,                /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */