Skip to content

Commit fd52afd

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

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
@@ -1783,16 +1783,22 @@ def test_prod(self):
17831783
self.assertRaises(TypeError, prod)
17841784
self.assertRaises(TypeError, prod, 42)
17851785
self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
1786-
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
1787-
self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
1786+
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='')
1787+
self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'')
17881788
values = [bytearray(b'a'), bytearray(b'b')]
1789-
self.assertRaises(TypeError, prod, values, bytearray(b''))
1789+
self.assertRaises(TypeError, prod, values, start=bytearray(b''))
17901790
self.assertRaises(TypeError, prod, [[1], [2], [3]])
17911791
self.assertRaises(TypeError, prod, [{2:3}])
1792-
self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
1793-
self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
1792+
self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3})
1793+
self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[])
1794+
1795+
# Some odd cases
1796+
self.assertEqual(prod([2, 3], start='ab'), 'abababababab')
1797+
self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
1798+
self.assertEqual(prod([], start={2: 3}), {2:3})
1799+
17941800
with self.assertRaises(TypeError):
1795-
prod([10, 20], [30, 40]) # start is a keyword-only argument
1801+
prod([10, 20], 1) # start is a keyword-only argument
17961802

17971803
self.assertEqual(prod([0, 1, 2, 3]), 0)
17981804
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
@@ -3081,14 +3081,9 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
30813081
}
30823082

30833083
if (result == NULL) {
3084-
result = PyLong_FromLong(1);
3085-
if (result == NULL) {
3086-
Py_DECREF(iter);
3087-
return NULL;
3088-
}
3089-
} else {
3090-
Py_INCREF(result);
3084+
result = _PyLong_GetOne();
30913085
}
3086+
Py_INCREF(result);
30923087
#ifndef SLOW_PROD
30933088
/* Fast paths for integers keeping temporary products in C.
30943089
* Assumes all inputs are the same type.
@@ -3104,7 +3099,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
31043099
}
31053100
/* Loop over all the items in the iterable until we finish, we overflow
31063101
* or we found a non integer element */
3107-
while(result == NULL) {
3102+
while (result == NULL) {
31083103
item = PyIter_Next(iter);
31093104
if (item == NULL) {
31103105
Py_DECREF(iter);

0 commit comments

Comments
 (0)