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

Give itertools.repeat() a length method.

parent 27da291b
...@@ -607,6 +607,12 @@ class TestVariousIteratorArgs(unittest.TestCase): ...@@ -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} ...@@ -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
......
...@@ -2347,6 +2347,19 @@ repeat_next(repeatobject *ro) ...@@ -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 = { ...@@ -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 */
......
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