]> granicus.if.org Git - python/commitdiff
bpo-34637: Make the *start* argument for *sum()* visible as a keyword argument. ...
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Wed, 12 Sep 2018 17:54:06 +0000 (10:54 -0700)
committerGitHub <noreply@github.com>
Wed, 12 Sep 2018 17:54:06 +0000 (10:54 -0700)
Doc/library/functions.rst
Lib/test/test_builtin.py
Misc/NEWS.d/next/Core and Builtins/2018-09-11-17-25-44.bpo-34637.HSLqY4.rst [new file with mode: 0644]
Python/bltinmodule.c
Python/clinic/bltinmodule.c.h

index 48cd9b04750b1c6d3e7c9fb4f8517dbb6b8e28d8..17960eb9c10e645975cc7426e764debe8131bd3d 100644 (file)
@@ -1488,6 +1488,9 @@ are always available.  They are listed here in alphabetical order.
    see :func:`math.fsum`\.  To concatenate a series of iterables, consider using
    :func:`itertools.chain`.
 
+   .. versionchanged:: 3.8
+      The *start* parameter can be specified as a keyword argument.
+
 .. function:: super([type[, object-or-type]])
 
    Return a proxy object that delegates method calls to a parent or sibling
index 233c579356530ca94793d507210cae644160b0d3..46cf2d328362fbd73510748f53b5fbdbf73fef11 100644 (file)
@@ -1297,6 +1297,9 @@ class BuiltinTest(unittest.TestCase):
         self.assertEqual(sum(iter(Squares(10))), 285)
         self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
 
+        self.assertEqual(sum(range(10), 1000), 1045)
+        self.assertEqual(sum(range(10), start=1000), 1045)
+
         self.assertRaises(TypeError, sum)
         self.assertRaises(TypeError, sum, 42)
         self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-11-17-25-44.bpo-34637.HSLqY4.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-11-17-25-44.bpo-34637.HSLqY4.rst
new file mode 100644 (file)
index 0000000..c22359c
--- /dev/null
@@ -0,0 +1 @@
+Make the *start* argument to *sum()* visible as a keyword argument.
index a23bdc1078c9175d442c1a18cc5ab65ac01fdac7..8001c603939a70dbac81141021ef139136bcaf50 100644 (file)
@@ -2272,8 +2272,8 @@ With an argument, equivalent to object.__dict__.");
 sum as builtin_sum
 
     iterable: object
-    start: object(c_default="NULL") = 0
     /
+    start: object(c_default="NULL") = 0
 
 Return the sum of a 'start' value (default: 0) plus an iterable of numbers
 
@@ -2284,7 +2284,7 @@ reject non-numeric types.
 
 static PyObject *
 builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
-/*[clinic end generated code: output=df758cec7d1d302f input=3b5b7a9d7611c73a]*/
+/*[clinic end generated code: output=df758cec7d1d302f input=162b50765250d222]*/
 {
     PyObject *result = start;
     PyObject *temp, *item, *iter;
index 285caf94b77d26e0250baa62a0e12c4bf833a5ed..121bbd4e65c12b9b106314cd6ad42b85e0ee8fc2 100644 (file)
@@ -608,7 +608,7 @@ exit:
 }
 
 PyDoc_STRVAR(builtin_sum__doc__,
-"sum($module, iterable, start=0, /)\n"
+"sum($module, iterable, /, start=0)\n"
 "--\n"
 "\n"
 "Return the sum of a \'start\' value (default: 0) plus an iterable of numbers\n"
@@ -618,20 +618,21 @@ PyDoc_STRVAR(builtin_sum__doc__,
 "reject non-numeric types.");
 
 #define BUILTIN_SUM_METHODDEF    \
-    {"sum", (PyCFunction)builtin_sum, METH_FASTCALL, builtin_sum__doc__},
+    {"sum", (PyCFunction)builtin_sum, METH_FASTCALL|METH_KEYWORDS, builtin_sum__doc__},
 
 static PyObject *
 builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start);
 
 static PyObject *
-builtin_sum(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+builtin_sum(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
 {
     PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"", "start", NULL};
+    static _PyArg_Parser _parser = {"O|O:sum", _keywords, 0};
     PyObject *iterable;
     PyObject *start = NULL;
 
-    if (!_PyArg_UnpackStack(args, nargs, "sum",
-        1, 2,
+    if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
         &iterable, &start)) {
         goto exit;
     }
@@ -710,4 +711,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=9f17c7a87d740374 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=eb6d08a32e7c83b6 input=a9049054013a1b77]*/