summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSkip Montanaro <skip@pobox.com>2003-01-02 20:51:08 (GMT)
committerSkip Montanaro <skip@pobox.com>2003-01-02 20:51:08 (GMT)
commit4abd5f0fce54d32fbe01207e505047bd82ff9ca3 (patch)
tree7c94a45859968c9e92cf2c5970ee2d4071a9b7a8
parentfe8496ca03e93b74fe007de50f0e05347a772a60 (diff)
downloadcpython-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.tex11
-rw-r--r--Lib/test/test_sort.py20
-rw-r--r--Misc/NEWS4
-rw-r--r--Objects/listobject.c5
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},