mirror of https://github.com/python/cpython
Allow list sort's comparison function to explicitly be None. See SF patch
661092.
This commit is contained in:
parent
fe8496ca03
commit
4abd5f0fce
|
@ -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)}
|
||||
\lineiii{\var{s}.reverse()}
|
||||
{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)}
|
||||
\end{tableiii}
|
||||
\indexiv{operations on}{mutable}{sequence}{types}
|
||||
|
@ -970,10 +970,11 @@ Notes:
|
|||
the first argument is considered smaller than, equal to, or larger
|
||||
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
|
||||
faster to call method \method{sort()} followed by
|
||||
\method{reverse()} than to use method
|
||||
\method{sort()} with a comparison function that reverses the
|
||||
ordering of the elements.
|
||||
faster to call method \method{sort()} followed by \method{reverse()}
|
||||
than to use method \method{sort()} with a comparison function that
|
||||
reverses the ordering of the elements. Passing \constant{None} as the
|
||||
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
|
||||
the language (a sort is stable if it guarantees not to change the
|
||||
|
|
|
@ -145,6 +145,26 @@ def 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:
|
||||
print "Test failed", nerrors
|
||||
elif verbose:
|
||||
|
|
|
@ -12,6 +12,10 @@ What's New in Python 2.3 alpha 2?
|
|||
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
|
||||
-----------------
|
||||
|
||||
|
|
|
@ -1657,6 +1657,9 @@ listsort(PyListObject *self, PyObject *args)
|
|||
if (!PyArg_UnpackTuple(args, "sort", 0, 1, &compare))
|
||||
return NULL;
|
||||
}
|
||||
if (compare == Py_None)
|
||||
compare = NULL;
|
||||
|
||||
merge_init(&ms, compare);
|
||||
|
||||
/* The list is temporarily made empty, so that mutations performed
|
||||
|
@ -2069,7 +2072,7 @@ PyDoc_STRVAR(count_doc,
|
|||
PyDoc_STRVAR(reverse_doc,
|
||||
"L.reverse() -- reverse *IN PLACE*");
|
||||
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[] = {
|
||||
{"append", (PyCFunction)listappend, METH_O, append_doc},
|
||||
|
|
Loading…
Reference in New Issue