Skip to content

Commit cd00fee

Browse files
bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595) (GH-28604)
(cherry picked from commit 8497514) Co-authored-by: Pablo Galindo Salgado <[email protected]>
1 parent fe7746c commit cd00fee

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

Lib/test/test_math.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,16 +1724,22 @@ def test_prod(self):
17241724
self.assertRaises(TypeError, prod)
17251725
self.assertRaises(TypeError, prod, 42)
17261726
self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
1727-
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
1728-
self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
1727+
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='')
1728+
self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'')
17291729
values = [bytearray(b'a'), bytearray(b'b')]
1730-
self.assertRaises(TypeError, prod, values, bytearray(b''))
1730+
self.assertRaises(TypeError, prod, values, start=bytearray(b''))
17311731
self.assertRaises(TypeError, prod, [[1], [2], [3]])
17321732
self.assertRaises(TypeError, prod, [{2:3}])
1733-
self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
1734-
self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
1733+
self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3})
1734+
self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[])
1735+
1736+
# Some odd cases
1737+
self.assertEqual(prod([2, 3], start='ab'), 'abababababab')
1738+
self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
1739+
self.assertEqual(prod([], start={2: 3}), {2:3})
1740+
17351741
with self.assertRaises(TypeError):
1736-
prod([10, 20], [30, 40]) # start is a keyword-only argument
1742+
prod([10, 20], 1) # start is a keyword-only argument
17371743

17381744
self.assertEqual(prod([0, 1, 2, 3]), 0)
17391745
self.assertEqual(prod([1, 0, 2, 3]), 0)

Modules/mathmodule.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2969,14 +2969,9 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
29692969
}
29702970

29712971
if (result == NULL) {
2972-
result = PyLong_FromLong(1);
2973-
if (result == NULL) {
2974-
Py_DECREF(iter);
2975-
return NULL;
2976-
}
2977-
} else {
2978-
Py_INCREF(result);
2972+
result = _PyLong_One;
29792973
}
2974+
Py_INCREF(result);
29802975
#ifndef SLOW_PROD
29812976
/* Fast paths for integers keeping temporary products in C.
29822977
* Assumes all inputs are the same type.
@@ -2992,7 +2987,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
29922987
}
29932988
/* Loop over all the items in the iterable until we finish, we overflow
29942989
* or we found a non integer element */
2995-
while(result == NULL) {
2990+
while (result == NULL) {
29962991
item = PyIter_Next(iter);
29972992
if (item == NULL) {
29982993
Py_DECREF(iter);

0 commit comments

Comments
 (0)