Commit beed8538 authored by Guido van Rossum's avatar Guido van Rossum

Patch by Keir Mierle so that sets can be compared to other objects that know

how to compare themselves to sets.  (Prep work for making dict views more
set-like.)
parent 23ad7ca2
......@@ -492,6 +492,42 @@ class TestSet(TestJointOps):
s = None
self.assertRaises(ReferenceError, str, p)
def test_rich_compare(self):
class TestRichSetCompare:
def __gt__(self, some_set):
self.gt_called = True
return False
def __lt__(self, some_set):
self.lt_called = True
return False
def __ge__(self, some_set):
self.ge_called = True
return False
def __le__(self, some_set):
self.le_called = True
return False
# This first tries the bulitin rich set comparison, which doesn't know
# how to handle the custom object. Upon returning NotImplemented, the
# corresponding comparison on the right object is invoked.
myset = {1, 2, 3}
myobj = TestRichSetCompare()
myset < myobj
self.assert_(myobj.gt_called)
myobj = TestRichSetCompare()
myset > myobj
self.assert_(myobj.lt_called)
myobj = TestRichSetCompare()
myset <= myobj
self.assert_(myobj.ge_called)
myobj = TestRichSetCompare()
myset >= myobj
self.assert_(myobj.le_called)
# C API test only available in a debug build
if hasattr(set, "test_c_api"):
def test_c_api(self):
......
......@@ -1607,12 +1607,8 @@ set_richcompare(PySetObject *v, PyObject *w, int op)
PyObject *r1, *r2;
if(!PyAnySet_Check(w)) {
if (op == Py_EQ)
Py_RETURN_FALSE;
if (op == Py_NE)
Py_RETURN_TRUE;
PyErr_SetString(PyExc_TypeError, "can only compare to a set");
return NULL;
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
switch (op) {
case Py_EQ:
......
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