On Mon, Feb 11, 2019 at 12:19 AM Terry Reedy <tjre...@udel.edu> wrote: > The pass-by-position limitation is not in CPython, it is the behavior of > C functions, which is the behavior of function calls in probably every > assembly and machine language. Allowing the flexibility of Python > function calls take extra code and slows function calls. > > math.sin, for instance, is a fast-as-possible wrapper around the C math > library sin function. It extracts the C double from the Python float, > calls C sin, and returns the returned C double wrapped as a Python > float. Coredevs decided that being able to call math.sin(x=.33333) is > not worth the resulting slowdown. I am rather sure that heavy users of > the math module would agree.
For math.sin, sure, but what about, say, list.index? Here's the start of the implementation: static PyObject * listindex(PyListObject *self, PyObject *args) { Py_ssize_t i, start=0, stop=Py_SIZE(self); PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &stop)) This is already paying the cost of not using C-style positional function arguments, but then it only takes an argument tuple, so it can't take keyword arguments anyway. Why? Wouldn't it be nice to be able to write: mylist.index(42, start=10, stop=99) instead of: mylist.index(42, 10, 99) This would also allow stop to be passed alone: mylist.index(42, stop=99) rather than having to pass the default value for start explicitly just so we can pass stop: mylist.index(42, 0, 99) -- https://mail.python.org/mailman/listinfo/python-list