diff options
author | Skip Montanaro <skip@pobox.com> | 2003-01-02 20:51:08 (GMT) |
---|---|---|
committer | Skip Montanaro <skip@pobox.com> | 2003-01-02 20:51:08 (GMT) |
commit | 4abd5f0fce54d32fbe01207e505047bd82ff9ca3 (patch) | |
tree | 7c94a45859968c9e92cf2c5970ee2d4071a9b7a8 | |
parent | fe8496ca03e93b74fe007de50f0e05347a772a60 (diff) | |
download | cpython-4abd5f0fce54d32fbe01207e505047bd82ff9ca3.zip cpython-4abd5f0fce54d32fbe01207e505047bd82ff9ca3.tar.gz cpython-4abd5f0fce54d32fbe01207e505047bd82ff9ca3.tar.bz2 |
Allow list sort's comparison function to explicitly be None. See SF patch
661092.
-rw-r--r-- | Doc/lib/libstdtypes.tex | 11 | ||||
-rw-r--r-- | Lib/test/test_sort.py | 20 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Objects/listobject.c | 5 |
4 files changed, 34 insertions, 6 deletions
diff --git a/Doc/lib/libstdtypes.tex b/Doc/lib/libstdtypes.tex index d5c7c5d..a377426 100644 --- a/Doc/lib/libstdtypes.tex +++ b/Doc/lib/libstdtypes.tex @@ -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 diff --git a/Lib/test/test_sort.py b/Lib/test/test_sort.py index 5c7ae88..6c35f42 100644 --- a/Lib/test/test_sort.py +++ b/Lib/test/test_sort.py @@ -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 ----------------- diff --git a/Objects/listobject.c b/Objects/listobject.c index 461350c..79403cc 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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}, |