From 4abd5f0fce54d32fbe01207e505047bd82ff9ca3 Mon Sep 17 00:00:00 2001
From: Skip Montanaro <skip@pobox.com>
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

