]> granicus.if.org Git - python/commitdiff
For collections.deque() objects, expose the maxlen parameter as a read-only attribute.
authorRaymond Hettinger <python@rcn.com>
Tue, 10 Mar 2009 12:50:59 +0000 (12:50 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 10 Mar 2009 12:50:59 +0000 (12:50 +0000)
Doc/library/collections.rst
Lib/test/test_deque.py
Misc/NEWS
Modules/_collectionsmodule.c

index 1815c79f0199c54071265c70e3fcd324ca1c4dec..d6d1b68d0b05f723baa3341c7f547c61cdae8677 100644 (file)
@@ -382,6 +382,15 @@ counts, but the output will exclude results with counts of zero or less.
       ``d.appendleft(d.pop())``.
 
 
+   Deque objects also provide one read-only attribute:
+
+   .. attribute:: maxlen
+
+      Maximum size of a deque or *None* if unbounded.
+
+      .. versionadded:: 2.7
+
+
 In addition to the above, deques support iteration, pickling, ``len(d)``,
 ``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with
 the :keyword:`in` operator, and subscript references such as ``d[-1]``.  Indexed
index dcef24656ad189d86e3a1e0008e7a85556133151..a68d014e1cd4e7e8fd0f138b5d09714b918b6a53 100644 (file)
@@ -104,6 +104,16 @@ class TestBasic(unittest.TestCase):
         d.extendleft(it)
         self.assertEqual(list(it), [])
 
+    def test_maxlen_attribute(self):
+        self.assertEqual(deque().maxlen, None)
+        self.assertEqual(deque('abc').maxlen, None)
+        self.assertEqual(deque('abc', maxlen=4).maxlen, 4)
+        self.assertEqual(deque('abc', maxlen=2).maxlen, 2)
+        self.assertEqual(deque('abc', maxlen=0).maxlen, 0)
+        with self.assertRaises(AttributeError):
+            d = deque('abc')
+            d.maxlen = 10
+
     def test_comparisons(self):
         d = deque('xabc'); d.popleft()
         for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
index d7be33181da88c4a452fe5712bf4ad694a5756cb..760badf6018c2d71fd4845febe4a1acc5fe00851 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -168,6 +168,8 @@ Core and Builtins
 Library
 -------
 
+- collections.deque() objects now have a read-only attribute called maxlen.
+
 - Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after
   it is has been populated and properly configured in order to prevent
   window flashing.
index 9532f1b51c25b63e8cdd75a2a2d0c5469c788f20..a4fdf76c04ec79aaf9e903a72f302750f99ea5ab 100644 (file)
@@ -870,6 +870,20 @@ deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
        return 0;
 }
 
+static PyObject *
+deque_get_maxlen(dequeobject *deque)
+{
+       if (deque->maxlen == -1)
+               Py_RETURN_NONE;
+       return PyInt_FromSsize_t(deque->maxlen);
+}
+
+static PyGetSetDef deque_getset[] = {
+       {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
+        "maximum size of a deque or None if unbounded"},
+       {0}
+};
+
 static PySequenceMethods deque_as_sequence = {
        (lenfunc)deque_len,             /* sq_length */
        0,                              /* sq_concat */
@@ -951,7 +965,7 @@ static PyTypeObject deque_type = {
        0,                              /* tp_iternext */
        deque_methods,                  /* tp_methods */
        0,                              /* tp_members */
-       0,                              /* tp_getset */
+       deque_getset,   /* tp_getset */
        0,                              /* tp_base */
        0,                              /* tp_dict */
        0,                              /* tp_descr_get */