Allow list sort's comparison function to explicitly be None. See SF patch

661092.
This commit is contained in:
Skip Montanaro 2003-01-02 20:51:08 +00:00
parent fe8496ca03
commit 4abd5f0fce
4 changed files with 34 additions and 6 deletions

View File

@ -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

View File

@ -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:

View File

@ -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
-----------------

View File

@ -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},