Kaydet (Commit) 2ba198d2 authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

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.
üst 35c8658a
......@@ -198,7 +198,8 @@ class TestHeapC(TestHeap):
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)
......@@ -215,9 +216,8 @@ class TestHeapC(TestHeap):
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)
#==============================================================================
......
......@@ -8,28 +8,10 @@ annotated by Fran
#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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment