Commit 5bb0f0e0 authored by Raymond Hettinger's avatar Raymond Hettinger

For collections.deque() objects, expose the maxlen parameter as a read-only attribute.

parent 060c7f6b
...@@ -361,6 +361,15 @@ counts, but the output will exclude results with counts of zero or less. ...@@ -361,6 +361,15 @@ counts, but the output will exclude results with counts of zero or less.
``d.appendleft(d.pop())``. ``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)``, In addition to the above, deques support iteration, pickling, ``len(d)``,
``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with ``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with
the :keyword:`in` operator, and subscript references such as ``d[-1]``. Indexed the :keyword:`in` operator, and subscript references such as ``d[-1]``. Indexed
......
...@@ -105,6 +105,16 @@ class TestBasic(unittest.TestCase): ...@@ -105,6 +105,16 @@ class TestBasic(unittest.TestCase):
d.extendleft(it) d.extendleft(it)
self.assertEqual(list(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): def test_comparisons(self):
d = deque('xabc'); d.popleft() d = deque('xabc'); d.popleft()
for e in [d, deque('abc'), deque('ab'), deque(), list(d)]: for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
......
...@@ -195,6 +195,8 @@ Core and Builtins ...@@ -195,6 +195,8 @@ Core and Builtins
Library Library
------- -------
- collections.deque() objects now have a read-only attribute called maxlen.
- Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after - Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after
it is has been populated and properly configured in order to prevent it is has been populated and properly configured in order to prevent
window flashing. window flashing.
......
...@@ -812,6 +812,20 @@ deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs) ...@@ -812,6 +812,20 @@ deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
return 0; 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 = { static PySequenceMethods deque_as_sequence = {
(lenfunc)deque_len, /* sq_length */ (lenfunc)deque_len, /* sq_length */
0, /* sq_concat */ 0, /* sq_concat */
...@@ -893,7 +907,7 @@ static PyTypeObject deque_type = { ...@@ -893,7 +907,7 @@ static PyTypeObject deque_type = {
0, /* tp_iternext */ 0, /* tp_iternext */
deque_methods, /* tp_methods */ deque_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ deque_getset, /* tp_getset */
0, /* tp_base */ 0, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment