mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595)
(cherry picked from commit 84975146a7
)
Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
parent
acd46feff3
commit
fd52afd192
2 changed files with 15 additions and 14 deletions
|
@ -1783,16 +1783,22 @@ class MathTests(unittest.TestCase):
|
||||||
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)
|
||||||
|
|
|
@ -3081,14 +3081,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.
|
||||||
|
@ -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
|
/* 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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue