bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595)

This commit is contained in:
Pablo Galindo Salgado 2021-09-28 13:32:43 +01:00 committed by GitHub
parent e649e0658f
commit 84975146a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 14 deletions

View file

@ -1803,16 +1803,22 @@ def test_prod(self):
self.assertRaises(TypeError, prod) self.assertRaises(TypeError, prod)
self.assertRaises(TypeError, prod, 42) self.assertRaises(TypeError, prod, 42)
self.assertRaises(TypeError, prod, ['a', 'b', 'c']) self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '') self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='')
self.assertRaises(TypeError, prod, [b'a', b'c'], b'') self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'')
values = [bytearray(b'a'), bytearray(b'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, [[1], [2], [3]])
self.assertRaises(TypeError, prod, [{2:3}]) self.assertRaises(TypeError, prod, [{2:3}])
self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3}) self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3})
self.assertRaises(TypeError, prod, [[1], [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): 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([0, 1, 2, 3]), 0)
self.assertEqual(prod([1, 0, 2, 3]), 0) self.assertEqual(prod([1, 0, 2, 3]), 0)

View file

@ -3082,14 +3082,9 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
} }
if (result == NULL) { if (result == NULL) {
result = PyLong_FromLong(1); result = _PyLong_GetOne();
if (result == NULL) {
Py_DECREF(iter);
return NULL;
}
} else {
Py_INCREF(result);
} }
Py_INCREF(result);
#ifndef SLOW_PROD #ifndef SLOW_PROD
/* Fast paths for integers keeping temporary products in C. /* Fast paths for integers keeping temporary products in C.
* Assumes all inputs are the same type. * Assumes all inputs are the same type.
@ -3105,7 +3100,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
} }
/* Loop over all the items in the iterable until we finish, we overflow /* Loop over all the items in the iterable until we finish, we overflow
* or we found a non integer element */ * or we found a non integer element */
while(result == NULL) { while (result == NULL) {
item = PyIter_Next(iter); item = PyIter_Next(iter);
if (item == NULL) { if (item == NULL) {
Py_DECREF(iter); Py_DECREF(iter);