From ab078ddb4f8a7ac68f54a3c7f110f4d82e82b16f Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 6 Jan 2008 00:09:11 +0000 Subject: [PATCH] Issue #1393: object_richcompare() returns NotImplemented instead of False if the objects aren't equal, to give the other side a chance. --- Lib/test/test_compare.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ Objects/typeobject.c | 5 ++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_compare.py b/Lib/test/test_compare.py index c6608379a13..15fe3c20222 100644 --- a/Lib/test/test_compare.py +++ b/Lib/test/test_compare.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 22c4f869c51..72a28840e15 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 982eedb4255..2a0dd2458aa 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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;