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)
#==============================================================================
#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