Commits

Amaury Forgeot d'Arc committed e39c810

Remove 2.6 compatibility code:
now heapqueue items must implement the "<" operator.

The compatibility code could not work: all 3.0 objects have a __lt__ method
(which returns NotImplemented)

Twisted will have to adapt its DelayedCall class.

Comments (0)

Files changed (2)

Lib/test/test_heapq.py

     module = c_heapq
 
     def test_comparison_operator(self):
-        # Issue 3501: Make sure heapq works with both __lt__ and __le__
+        # Issue 3501: Make sure heapq works with both __lt__
+        # For python 3.0, __le__ alone is not enough
         def hsort(data, comp):
             data = [comp(x) for x in data]
             self.module.heapify(data)
                 return self.x >= other.x
         data = [random.random() for i in range(100)]
         target = sorted(data, reverse=True)
-        print("HASATTR", hasattr(LE(0), "__lt__"), LE(0).__lt__)
         self.assertEqual(hsort(data, LT), target)
-        self.assertEqual(hsort(data, LE), target)
+        self.assertRaises(TypeError, data, LE)
 
 
 #==============================================================================

Modules/_heapqmodule.c

 
 #include "Python.h"
 
-/* Older implementations of heapq used Py_LE for comparisons.  Now, it uses
-   Py_LT so it will match min(), sorted(), and bisect().  Unfortunately, some
-   client code (Twisted for example) relied on Py_LE, so this little function
-   restores compatability by trying both.
-*/
 static int
 cmp_lt(PyObject *x, PyObject *y)
 {
-	int cmp;
-	static PyObject *lt = NULL;
-
-	if (lt == NULL) {
-		lt = PyUnicode_FromString("__lt__");
-		if (lt == NULL)
-			return -1;
-	}
-	if (PyObject_HasAttr(x, lt))
-		return PyObject_RichCompareBool(x, y, Py_LT);
-	cmp = PyObject_RichCompareBool(y, x, Py_LE);
-	if (cmp != -1)
-		cmp = 1 - cmp;
-	return cmp;
+	return PyObject_RichCompareBool(x, y, Py_LT);
 }
 
 static int