Skip to content
This repository was archived by the owner on Feb 13, 2025. It is now read-only.

Commit 7cf8beb

Browse files
Issue python#29331: Simplified argument parsing in sorted() and list.sort().
1 parent 5e65cd3 commit 7cf8beb

File tree

2 files changed

+20
-24
lines changed

2 files changed

+20
-24
lines changed

Objects/listobject.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,7 +1912,7 @@ reverse_sortslice(sortslice *s, Py_ssize_t n)
19121912
* duplicated).
19131913
*/
19141914
static PyObject *
1915-
listsort(PyListObject *self, PyObject *args, PyObject *kwds)
1915+
listsort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
19161916
{
19171917
MergeState ms;
19181918
Py_ssize_t nremaining;
@@ -1922,24 +1922,11 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
19221922
PyObject **saved_ob_item;
19231923
PyObject **final_ob_item;
19241924
PyObject *result = NULL; /* guilty until proved innocent */
1925-
int reverse = 0;
1926-
PyObject *keyfunc = NULL;
19271925
Py_ssize_t i;
1928-
static char *kwlist[] = {"key", "reverse", 0};
19291926
PyObject **keys;
19301927

19311928
assert(self != NULL);
19321929
assert (PyList_Check(self));
1933-
if (args != NULL) {
1934-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
1935-
kwlist, &keyfunc, &reverse))
1936-
return NULL;
1937-
if (Py_SIZE(args) > 0) {
1938-
PyErr_SetString(PyExc_TypeError,
1939-
"must use keyword argument for key function");
1940-
return NULL;
1941-
}
1942-
}
19431930
if (keyfunc == Py_None)
19441931
keyfunc = NULL;
19451932

@@ -2088,14 +2075,27 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
20882075
#undef IFLT
20892076
#undef ISLT
20902077

2078+
static PyObject *
2079+
listsort(PyListObject *self, PyObject *args, PyObject *kwds)
2080+
{
2081+
static char *kwlist[] = {"key", "reverse", 0};
2082+
PyObject *keyfunc = NULL;
2083+
int reverse = 0;
2084+
2085+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|$Oi:sort",
2086+
kwlist, &keyfunc, &reverse))
2087+
return NULL;
2088+
return listsort_impl(self, keyfunc, reverse);
2089+
}
2090+
20912091
int
20922092
PyList_Sort(PyObject *v)
20932093
{
20942094
if (v == NULL || !PyList_Check(v)) {
20952095
PyErr_BadInternalCall();
20962096
return -1;
20972097
}
2098-
v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
2098+
v = listsort_impl((PyListObject *)v, NULL, 0);
20992099
if (v == NULL)
21002100
return -1;
21012101
Py_DECREF(v);

Python/bltinmodule.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2126,15 +2126,11 @@ PyDoc_STRVAR(builtin_sorted__doc__,
21262126
static PyObject *
21272127
builtin_sorted(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
21282128
{
2129-
PyObject *newlist, *v, *seq, *keyfunc=NULL;
2130-
PyObject *callable;
2131-
static const char * const kwlist[] = {"", "key", "reverse", 0};
2132-
/* args 1-3 should match listsort in Objects/listobject.c */
2133-
static _PyArg_Parser parser = {"O|Oi:sorted", kwlist, 0};
2134-
int reverse;
2135-
2136-
if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &parser,
2137-
&seq, &keyfunc, &reverse))
2129+
PyObject *newlist, *v, *seq, *callable;
2130+
2131+
/* Keyword arguments are passed through list.sort() which will check
2132+
them. */
2133+
if (!_PyArg_UnpackStack(args, nargs, "sorted", 1, 1, &seq))
21382134
return NULL;
21392135

21402136
newlist = PySequence_List(seq);

0 commit comments

Comments
 (0)