Skip to content

Commit 8497514

Browse files
authored
bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595)
1 parent e649e06 commit 8497514

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
@@ -1803,16 +1803,22 @@ def test_prod(self):
18031803
self.assertRaises(TypeError, prod)
18041804
self.assertRaises(TypeError, prod, 42)
18051805
self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
1806-
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
1807-
self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
1806+
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='')
1807+
self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'')
18081808
values = [bytearray(b'a'), bytearray(b'b')]
1809-
self.assertRaises(TypeError, prod, values, bytearray(b''))
1809+
self.assertRaises(TypeError, prod, values, start=bytearray(b''))
18101810
self.assertRaises(TypeError, prod, [[1], [2], [3]])
18111811
self.assertRaises(TypeError, prod, [{2:3}])
1812-
self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
1813-
self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
1812+
self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3})
1813+
self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[])
1814+
1815+
# Some odd cases
1816+
self.assertEqual(prod([2, 3], start='ab'), 'abababababab')
1817+
self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
1818+
self.assertEqual(prod([], start={2: 3}), {2:3})
1819+
18141820
with self.assertRaises(TypeError):
1815-
prod([10, 20], [30, 40]) # start is a keyword-only argument
1821+
prod([10, 20], 1) # start is a keyword-only argument
18161822

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

30843084
if (result == NULL) {
3085-
result = PyLong_FromLong(1);
3086-
if (result == NULL) {
3087-
Py_DECREF(iter);
3088-
return NULL;
3089-
}
3090-
} else {
3091-
Py_INCREF(result);
3085+
result = _PyLong_GetOne();
30923086
}
3087+
Py_INCREF(result);
30933088
#ifndef SLOW_PROD
30943089
/* Fast paths for integers keeping temporary products in C.
30953090
* Assumes all inputs are the same type.
@@ -3105,7 +3100,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
31053100
}
31063101
/* Loop over all the items in the iterable until we finish, we overflow
31073102
* or we found a non integer element */
3108-
while(result == NULL) {
3103+
while (result == NULL) {
31093104
item = PyIter_Next(iter);
31103105
if (item == NULL) {
31113106
Py_DECREF(iter);

0 commit comments

Comments
 (0)