summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-09-28 12:56:52 (GMT)
committerGitHub <noreply@github.com>2021-09-28 12:56:52 (GMT)
commitfd52afd1928643a715202147b1ce5b0d130ec252 (patch)
tree28a65cc5dc175d275bf70eb3a1b036af453b37bd
parentacd46feff3c06d3f1d00ab850e530c519445a737 (diff)
downloadcpython-fd52afd1928643a715202147b1ce5b0d130ec252.zip
cpython-fd52afd1928643a715202147b1ce5b0d130ec252.tar.gz
cpython-fd52afd1928643a715202147b1ce5b0d130ec252.tar.bz2
bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595)
(cherry picked from commit 84975146a7ce64f1d50dcec8311b7f7188a5c962) Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
-rw-r--r--Lib/test/test_math.py18
-rw-r--r--Modules/mathmodule.c11
2 files changed, 15 insertions, 14 deletions
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index 3d12874..e5f4e2b 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -1783,16 +1783,22 @@ class MathTests(unittest.TestCase):
self.assertRaises(TypeError, prod)
self.assertRaises(TypeError, prod, 42)
self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
- self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
- self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
+ self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='')
+ self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'')
values = [bytearray(b'a'), bytearray(b'b')]
- self.assertRaises(TypeError, prod, values, bytearray(b''))
+ self.assertRaises(TypeError, prod, values, start=bytearray(b''))
self.assertRaises(TypeError, prod, [[1], [2], [3]])
self.assertRaises(TypeError, prod, [{2:3}])
- self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
- self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
+ self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3})
+ self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[])
+
+ # Some odd cases
+ self.assertEqual(prod([2, 3], start='ab'), 'abababababab')
+ self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
+ self.assertEqual(prod([], start={2: 3}), {2:3})
+
with self.assertRaises(TypeError):
- prod([10, 20], [30, 40]) # start is a keyword-only argument
+ prod([10, 20], 1) # start is a keyword-only argument
self.assertEqual(prod([0, 1, 2, 3]), 0)
self.assertEqual(prod([1, 0, 2, 3]), 0)
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index a2a2db2..16da008 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -3081,14 +3081,9 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
}
if (result == NULL) {
- result = PyLong_FromLong(1);
- if (result == NULL) {
- Py_DECREF(iter);
- return NULL;
- }
- } else {
- Py_INCREF(result);
+ result = _PyLong_GetOne();
}
+ Py_INCREF(result);
#ifndef SLOW_PROD
/* Fast paths for integers keeping temporary products in C.
* Assumes all inputs are the same type.
@@ -3104,7 +3099,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
}
/* Loop over all the items in the iterable until we finish, we overflow
* or we found a non integer element */
- while(result == NULL) {
+ while (result == NULL) {
item = PyIter_Next(iter);
if (item == NULL) {
Py_DECREF(iter);