cpython (2.7): Issue #19145: Fix handling of negative values for a "times" keyword argument
http://hg.python.org/cpython/rev/85dc4684c83e changeset: 91389:85dc4684c83e branch: 2.7 parent: 91381:129ec3d90a67 user: Raymond Hettinger <python@rcn.com> date: Tue Jun 24 21:53:45 2014 -0700 summary: Issue #19145: Fix handling of negative values for a "times" keyword argument to itertools.repeat()> (Patch contributed by Vajrasky Kok.) files: Lib/test/test_itertools.py | 9 +++++++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++++ Modules/itertoolsmodule.c | 7 +++++-- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -698,6 +698,9 @@ def test_repeat(self): self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a']) + self.assertEqual(list(repeat(object='a', times=0)), []) + self.assertEqual(list(repeat(object='a', times=-1)), []) + self.assertEqual(list(repeat(object='a', times=-2)), []) self.assertEqual(zip(xrange(3),repeat('a')), [(0, 'a'), (1, 'a'), (2, 'a')]) self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a']) @@ -714,6 +717,12 @@ list(r) self.assertEqual(repr(r), 'repeat((1+0j), 0)') + 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_imap(self): self.assertEqual(list(imap(operator.pow, range(3), range(1,7))), [0**1, 1**2, 2**3]) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1384,6 +1384,7 @@ Pauli Virtanen Frank Visser Johannes Vogel +Vajrasky Kok Alex Volkov Guido Vranken Martijn Vries diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -34,6 +34,10 @@ - Issue #21672: Fix the behavior of ntpath.join on UNC-style paths. +- Issue #19145: The times argument for itertools.repeat now handles + negative values the same way for keyword arguments as it does for + positional arguments. + - Issue #21832: Require named tuple inputs to be exact strings. - Issue #8343: Named group error messages in the re module did not show diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -3683,14 +3683,17 @@ { repeatobject *ro; PyObject *element; - Py_ssize_t cnt = -1; + Py_ssize_t cnt = -1, n_kwds = 0; static char *kwargs[] = {"object", "times", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs, &element, &cnt)) 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; ro = (repeatobject *)type->tp_alloc(type, 0); -- Repository URL: http://hg.python.org/cpython
participants (1)
-
raymond.hettinger