From 5bb0f0e072ef22fa16bf281bc5e6b5d7a1594beb Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 10 Mar 2009 12:56:32 +0000 Subject: For collections.deque() objects, expose the maxlen parameter as a read-only attribute. --- Doc/library/collections.rst | 9 +++++++++ Lib/test/test_deque.py | 10 ++++++++++ Misc/NEWS | 2 ++ Modules/_collectionsmodule.c | 16 +++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index ce47bd0..ef1bca2 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -361,6 +361,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 diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index a9e010e..fab5a7c 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -105,6 +105,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)]: diff --git a/Misc/NEWS b/Misc/NEWS index ad28735..b870bcf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -195,6 +195,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. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 8d27b88..f8d656c 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -812,6 +812,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 PyLong_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 */ @@ -893,7 +907,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 */ -- cgit v0.12