Give itertools.repeat() a length method.

This commit is contained in:
Raymond Hettinger 2004-02-10 09:25:40 +00:00
parent 27da291b2c
commit 5cab2e3a88
2 changed files with 21 additions and 2 deletions

View File

@ -607,6 +607,12 @@ class TestVariousIteratorArgs(unittest.TestCase):
self.assertRaises(TypeError, list, tee(N(s))[0]) self.assertRaises(TypeError, list, tee(N(s))[0])
self.assertRaises(ZeroDivisionError, list, tee(E(s))[0]) self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
class LengthTransparency(unittest.TestCase):
def test_repeat(self):
self.assertEqual(len(repeat(None, 50)), 50)
self.assertRaises(TypeError, len, repeat(None))
class RegressionTests(unittest.TestCase): class RegressionTests(unittest.TestCase):
def test_sf_793826(self): def test_sf_793826(self):
@ -826,7 +832,7 @@ __test__ = {'libreftest' : libreftest}
def test_main(verbose=None): def test_main(verbose=None):
test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC, test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
RegressionTests) RegressionTests, LengthTransparency)
test_support.run_unittest(*test_classes) test_support.run_unittest(*test_classes)
# verify reference counting # verify reference counting

View File

@ -2347,6 +2347,19 @@ repeat_next(repeatobject *ro)
return ro->element; return ro->element;
} }
static int
repeat_len(repeatobject *ro)
{
if (ro->cnt == -1)
PyErr_SetString(PyExc_TypeError, "len() of unsized object");
return (int)(ro->cnt);
}
static PySequenceMethods repeat_as_sequence = {
(inquiry)repeat_len, /* sq_length */
0, /* sq_concat */
};
PyDoc_STRVAR(repeat_doc, PyDoc_STRVAR(repeat_doc,
"repeat(element [,times]) -> create an iterator which returns the element\n\ "repeat(element [,times]) -> create an iterator which returns the element\n\
for the specified number of times. If not specified, returns the element\n\ for the specified number of times. If not specified, returns the element\n\
@ -2366,7 +2379,7 @@ static PyTypeObject repeat_type = {
0, /* tp_compare */ 0, /* tp_compare */
0, /* tp_repr */ 0, /* tp_repr */
0, /* tp_as_number */ 0, /* tp_as_number */
0, /* tp_as_sequence */ &repeat_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
0, /* tp_hash */ 0, /* tp_hash */
0, /* tp_call */ 0, /* tp_call */