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

Issue #1393: object_richcompare() returns NotImplemented instead of

 False if the objects aren't equal, to give the other side a chance.
parent 673f7efa
...@@ -16,6 +16,13 @@ class Cmp: ...@@ -16,6 +16,13 @@ class Cmp:
def __eq__(self, other): def __eq__(self, other):
return self.arg == other return self.arg == other
class Anything:
def __eq__(self, other):
return True
def __ne__(self, other):
return False
class ComparisonTest(unittest.TestCase): class ComparisonTest(unittest.TestCase):
set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)] set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)]
set2 = [[1], (3,), None, Empty()] set2 = [[1], (3,), None, Empty()]
...@@ -45,6 +52,15 @@ class ComparisonTest(unittest.TestCase): ...@@ -45,6 +52,15 @@ class ComparisonTest(unittest.TestCase):
self.assertTrue(a == b) self.assertTrue(a == b)
self.assertFalse(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(): def test_main():
test_support.run_unittest(ComparisonTest) test_support.run_unittest(ComparisonTest)
......
...@@ -12,6 +12,9 @@ What's New in Python 3.0a3? ...@@ -12,6 +12,9 @@ What's New in Python 3.0a3?
Core and Builtins 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 - Issue #1692: Interpreter was not displaying location of SyntaxError
- Improve some exception messages when Windows fails to load an extension - Improve some exception messages when Windows fails to load an extension
......
...@@ -2484,7 +2484,10 @@ object_richcompare(PyObject *self, PyObject *other, int op) ...@@ -2484,7 +2484,10 @@ object_richcompare(PyObject *self, PyObject *other, int op)
switch (op) { switch (op) {
case Py_EQ: 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); Py_INCREF(res);
break; break;
......
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