This commit is contained in:
Raymond Hettinger 2014-06-24 21:39:27 -07:00
commit ee205dc7d8
3 changed files with 19 additions and 2 deletions

View file

@ -967,6 +967,12 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2)) self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
self.pickletest(repeat(object='a', times=10)) self.pickletest(repeat(object='a', times=10))
def test_repeat_with_negative_times(self):
self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
def test_map(self): def test_map(self):
self.assertEqual(list(map(operator.pow, range(3), range(1,7))), self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
[0**1, 1**2, 2**3]) [0**1, 1**2, 2**3])
@ -1741,8 +1747,15 @@ class LengthTransparency(unittest.TestCase):
def test_repeat(self): def test_repeat(self):
self.assertEqual(operator.length_hint(repeat(None, 50)), 50) self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
self.assertEqual(operator.length_hint(repeat(None, 0)), 0)
self.assertEqual(operator.length_hint(repeat(None), 12), 12) self.assertEqual(operator.length_hint(repeat(None), 12), 12)
def test_repeat_with_negative_times(self):
self.assertEqual(operator.length_hint(repeat(None, -1)), 0)
self.assertEqual(operator.length_hint(repeat(None, -2)), 0)
self.assertEqual(operator.length_hint(repeat(None, times=-1)), 0)
self.assertEqual(operator.length_hint(repeat(None, times=-2)), 0)
class RegressionTests(unittest.TestCase): class RegressionTests(unittest.TestCase):
def test_sf_793826(self): def test_sf_793826(self):

View file

@ -1399,6 +1399,7 @@ Norman Vine
Pauli Virtanen Pauli Virtanen
Frank Visser Frank Visser
Johannes Vogel Johannes Vogel
Vajrasky Kok
Alex Volkov Alex Volkov
Martijn Vries Martijn Vries
Sjoerd de Vries Sjoerd de Vries

View file

@ -4109,14 +4109,17 @@ repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{ {
repeatobject *ro; repeatobject *ro;
PyObject *element; PyObject *element;
Py_ssize_t cnt = -1; Py_ssize_t cnt = -1, n_kwds = 0;
static char *kwargs[] = {"object", "times", NULL}; static char *kwargs[] = {"object", "times", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs, if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs,
&element, &cnt)) &element, &cnt))
return NULL; return NULL;
if (PyTuple_Size(args) == 2 && cnt < 0) if (kwds != NULL)
n_kwds = PyDict_Size(kwds);
/* Does user supply times argument? */
if ((PyTuple_Size(args) + n_kwds == 2) && cnt < 0)
cnt = 0; cnt = 0;
ro = (repeatobject *)type->tp_alloc(type, 0); ro = (repeatobject *)type->tp_alloc(type, 0);