mirror of
https://github.com/python/cpython.git
synced 2025-01-27 11:33:55 +08:00
Issue #29331: Simplified argument parsing in sorted() and list.sort().
This commit is contained in:
parent
5e65cd39df
commit
7cf8bebb07
@ -1912,7 +1912,7 @@ reverse_sortslice(sortslice *s, Py_ssize_t n)
|
||||
* duplicated).
|
||||
*/
|
||||
static PyObject *
|
||||
listsort(PyListObject *self, PyObject *args, PyObject *kwds)
|
||||
listsort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
|
||||
{
|
||||
MergeState ms;
|
||||
Py_ssize_t nremaining;
|
||||
@ -1922,24 +1922,11 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
|
||||
PyObject **saved_ob_item;
|
||||
PyObject **final_ob_item;
|
||||
PyObject *result = NULL; /* guilty until proved innocent */
|
||||
int reverse = 0;
|
||||
PyObject *keyfunc = NULL;
|
||||
Py_ssize_t i;
|
||||
static char *kwlist[] = {"key", "reverse", 0};
|
||||
PyObject **keys;
|
||||
|
||||
assert(self != NULL);
|
||||
assert (PyList_Check(self));
|
||||
if (args != NULL) {
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
|
||||
kwlist, &keyfunc, &reverse))
|
||||
return NULL;
|
||||
if (Py_SIZE(args) > 0) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"must use keyword argument for key function");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (keyfunc == Py_None)
|
||||
keyfunc = NULL;
|
||||
|
||||
@ -2088,6 +2075,19 @@ keyfunc_fail:
|
||||
#undef IFLT
|
||||
#undef ISLT
|
||||
|
||||
static PyObject *
|
||||
listsort(PyListObject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
static char *kwlist[] = {"key", "reverse", 0};
|
||||
PyObject *keyfunc = NULL;
|
||||
int reverse = 0;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|$Oi:sort",
|
||||
kwlist, &keyfunc, &reverse))
|
||||
return NULL;
|
||||
return listsort_impl(self, keyfunc, reverse);
|
||||
}
|
||||
|
||||
int
|
||||
PyList_Sort(PyObject *v)
|
||||
{
|
||||
@ -2095,7 +2095,7 @@ PyList_Sort(PyObject *v)
|
||||
PyErr_BadInternalCall();
|
||||
return -1;
|
||||
}
|
||||
v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
|
||||
v = listsort_impl((PyListObject *)v, NULL, 0);
|
||||
if (v == NULL)
|
||||
return -1;
|
||||
Py_DECREF(v);
|
||||
|
@ -2126,15 +2126,11 @@ PyDoc_STRVAR(builtin_sorted__doc__,
|
||||
static PyObject *
|
||||
builtin_sorted(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
|
||||
{
|
||||
PyObject *newlist, *v, *seq, *keyfunc=NULL;
|
||||
PyObject *callable;
|
||||
static const char * const kwlist[] = {"", "key", "reverse", 0};
|
||||
/* args 1-3 should match listsort in Objects/listobject.c */
|
||||
static _PyArg_Parser parser = {"O|Oi:sorted", kwlist, 0};
|
||||
int reverse;
|
||||
PyObject *newlist, *v, *seq, *callable;
|
||||
|
||||
if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &parser,
|
||||
&seq, &keyfunc, &reverse))
|
||||
/* Keyword arguments are passed through list.sort() which will check
|
||||
them. */
|
||||
if (!_PyArg_UnpackStack(args, nargs, "sorted", 1, 1, &seq))
|
||||
return NULL;
|
||||
|
||||
newlist = PySequence_List(seq);
|
||||
|
Loading…
Reference in New Issue
Block a user