diff options
-rw-r--r-- | Doc/library/collections.rst | 9 | ||||
-rw-r--r-- | Lib/test/test_deque.py | 10 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_collectionsmodule.c | 16 |
4 files changed, 36 insertions, 1 deletions
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 1815c79..d6d1b68 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -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 diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index dcef246..a68d014 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -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)]: @@ -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. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 9532f1b..a4fdf76 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -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 */ |