From 58ad24512a60694486ba50302cc1e805a84e7f94 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 24 Jun 2014 21:53:45 -0700 Subject: [PATCH] Issue #19145: Fix handling of negative values for a "times" keyword argument to itertools.repeat()> (Patch contributed by Vajrasky Kok.) --- 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 index 291aeb0471..1bf6c5335e 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -698,6 +698,9 @@ class TestBasicOps(unittest.TestCase): 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 @@ class TestBasicOps(unittest.TestCase): 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 index 983e048f93..b7792107cb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1384,6 +1384,7 @@ Norman Vine Pauli Virtanen Frank Visser Johannes Vogel +Vajrasky Kok Alex Volkov Guido Vranken Martijn Vries diff --git a/Misc/NEWS b/Misc/NEWS index f99c155003..fc7c67d13d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -34,6 +34,10 @@ Library - 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 index a7cd3f4a64..cd45eb9a47 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -3683,14 +3683,17 @@ repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { 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); -- 2.50.1