From 4abd5f0fce54d32fbe01207e505047bd82ff9ca3 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Thu, 2 Jan 2003 20:51:08 +0000 Subject: Allow list sort's comparison function to explicitly be None. See SF patch 661092. --- Doc/lib/libstdtypes.tex | 11 ++++++----- Lib/test/test_sort.py | 20 ++++++++++++++++++++ Misc/NEWS | 4 ++++ 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: diff --git a/Misc/NEWS b/Misc/NEWS index e786af5..b9c076d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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}, -- cgit v0.12