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

This commit is contained in:
Raymond Hettinger
2009-03-10 12:56:32 +00:00
parent 060c7f6bba
commit 5bb0f0e072
4 changed files with 36 additions and 1 deletions

View File

@@ -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

View File

@@ -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)]:

View File

@@ -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.

View File

@@ -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 = {
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 */