mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Allow list sort's comparison function to explicitly be None. See SF patch
661092.
This commit is contained in:
parent
fe8496ca03
commit
4abd5f0fce
4 changed files with 34 additions and 6 deletions
|
|
@ -925,7 +925,7 @@ The following operations are defined on mutable sequence types (where
|
||||||
{same as \code{del \var{s}[\var{s}.index(\var{x})]}}{(3)}
|
{same as \code{del \var{s}[\var{s}.index(\var{x})]}}{(3)}
|
||||||
\lineiii{\var{s}.reverse()}
|
\lineiii{\var{s}.reverse()}
|
||||||
{reverses the items of \var{s} in place}{(6)}
|
{reverses the items of \var{s} in place}{(6)}
|
||||||
\lineiii{\var{s}.sort(\optional{\var{cmpfunc}})}
|
\lineiii{\var{s}.sort(\optional{\var{cmpfunc=None}})}
|
||||||
{sort the items of \var{s} in place}{(6), (7), (8), (9)}
|
{sort the items of \var{s} in place}{(6), (7), (8), (9)}
|
||||||
\end{tableiii}
|
\end{tableiii}
|
||||||
\indexiv{operations on}{mutable}{sequence}{types}
|
\indexiv{operations on}{mutable}{sequence}{types}
|
||||||
|
|
@ -970,10 +970,11 @@ Notes:
|
||||||
the first argument is considered smaller than, equal to, or larger
|
the first argument is considered smaller than, equal to, or larger
|
||||||
than the second argument. Note that this slows the sorting process
|
than the second argument. Note that this slows the sorting process
|
||||||
down considerably; e.g. to sort a list in reverse order it is much
|
down considerably; e.g. to sort a list in reverse order it is much
|
||||||
faster to call method \method{sort()} followed by
|
faster to call method \method{sort()} followed by \method{reverse()}
|
||||||
\method{reverse()} than to use method
|
than to use method \method{sort()} with a comparison function that
|
||||||
\method{sort()} with a comparison function that reverses the
|
reverses the ordering of the elements. Passing \constant{None} as the
|
||||||
ordering of the elements.
|
comparison function is semantically equivalent to calling
|
||||||
|
\method{sort()} with no comparison function.
|
||||||
|
|
||||||
\item[(8)] Whether the \method{sort()} method is stable is not defined by
|
\item[(8)] Whether the \method{sort()} method is stable is not defined by
|
||||||
the language (a sort is stable if it guarantees not to change the
|
the language (a sort is stable if it guarantees not to change the
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,26 @@ def bug453523():
|
||||||
|
|
||||||
bug453523()
|
bug453523()
|
||||||
|
|
||||||
|
def cmpNone():
|
||||||
|
global nerrors
|
||||||
|
|
||||||
|
if verbose:
|
||||||
|
print "Testing None as a comparison function."
|
||||||
|
|
||||||
|
L = range(50)
|
||||||
|
random.shuffle(L)
|
||||||
|
try:
|
||||||
|
L.sort(None)
|
||||||
|
except TypeError:
|
||||||
|
print " Passing None as cmpfunc failed."
|
||||||
|
nerrors += 1
|
||||||
|
else:
|
||||||
|
if L != range(50):
|
||||||
|
print " Passing None as cmpfunc failed."
|
||||||
|
nerrors += 1
|
||||||
|
|
||||||
|
cmpNone()
|
||||||
|
|
||||||
if nerrors:
|
if nerrors:
|
||||||
print "Test failed", nerrors
|
print "Test failed", nerrors
|
||||||
elif verbose:
|
elif verbose:
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,10 @@ What's New in Python 2.3 alpha 2?
|
||||||
Core and builtins
|
Core and builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- List objects' sort() method now accepts None as the comparison function.
|
||||||
|
Passing None is semantically identical to calling sort() with no
|
||||||
|
arguments.
|
||||||
|
|
||||||
Extension modules
|
Extension modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1657,6 +1657,9 @@ listsort(PyListObject *self, PyObject *args)
|
||||||
if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
|
if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (compare == Py_None)
|
||||||
|
compare = NULL;
|
||||||
|
|
||||||
merge_init(&ms, compare);
|
merge_init(&ms, compare);
|
||||||
|
|
||||||
/* The list is temporarily made empty, so that mutations performed
|
/* The list is temporarily made empty, so that mutations performed
|
||||||
|
|
@ -2069,7 +2072,7 @@ PyDoc_STRVAR(count_doc,
|
||||||
PyDoc_STRVAR(reverse_doc,
|
PyDoc_STRVAR(reverse_doc,
|
||||||
"L.reverse() -- reverse *IN PLACE*");
|
"L.reverse() -- reverse *IN PLACE*");
|
||||||
PyDoc_STRVAR(sort_doc,
|
PyDoc_STRVAR(sort_doc,
|
||||||
"L.sort([cmpfunc]) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
|
"L.sort(cmpfunc=None) -- stable sort *IN PLACE*; cmpfunc(x, y) -> -1, 0, 1");
|
||||||
|
|
||||||
static PyMethodDef list_methods[] = {
|
static PyMethodDef list_methods[] = {
|
||||||
{"append", (PyCFunction)listappend, METH_O, append_doc},
|
{"append", (PyCFunction)listappend, METH_O, append_doc},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue