Issue #1393: object_richcompare() returns NotImplemented instead of

False if the objects aren't equal, to give the other side a chance.
This commit is contained in:
Guido van Rossum 2008-01-06 00:09:11 +00:00
parent 673f7efa08
commit ab078ddb4f
3 changed files with 23 additions and 1 deletions

View File

@ -16,6 +16,13 @@ class Cmp:
def __eq__(self, other):
return self.arg == other
class Anything:
def __eq__(self, other):
return True
def __ne__(self, other):
return False
class ComparisonTest(unittest.TestCase):
set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)]
set2 = [[1], (3,), None, Empty()]
@ -45,6 +52,15 @@ class ComparisonTest(unittest.TestCase):
self.assertTrue(a == b)
self.assertFalse(a != b)
def test_issue_1393(self):
x = lambda: None
self.assertEqual(x, Anything())
self.assertEqual(Anything(), x)
y = object()
self.assertEqual(y, Anything())
self.assertEqual(Anything(), y)
def test_main():
test_support.run_unittest(ComparisonTest)

View File

@ -12,6 +12,9 @@ What's New in Python 3.0a3?
Core and Builtins
-----------------
- Issue #1393: object_richcompare() returns NotImplemented instead of
False if the objects aren't equal, to give the other side a chance.
- Issue #1692: Interpreter was not displaying location of SyntaxError
- Improve some exception messages when Windows fails to load an extension

View File

@ -2484,7 +2484,10 @@ object_richcompare(PyObject *self, PyObject *other, int op)
switch (op) {
case Py_EQ:
res = (self == other) ? Py_True : Py_False;
/* Return NotImplemented instead of False, so if two
objects are compared, both get a chance at the
comparison. See issue #1393. */
res = (self == other) ? Py_True : Py_NotImplemented;
Py_INCREF(res);
break;