By default, != returns the opposite of ==, unless the latter returns

NotImplemented.

(Is this worth backporting to 2.6?  It seems so useful...!)
This commit is contained in:
Guido van Rossum 2007-03-27 22:37:34 +00:00
parent a4335b1e6b
commit e27dc72308
3 changed files with 25 additions and 1 deletions

View File

@ -39,6 +39,12 @@ class ComparisonTest(unittest.TestCase):
self.assertEqual(a == b, id(a) == id(b), self.assertEqual(a == b, id(a) == id(b),
'a=%r, b=%r' % (a, b)) 'a=%r, b=%r' % (a, b))
def test_ne_defaults_to_not_eq(self):
a = Cmp(1)
b = Cmp(1)
self.assertTrue(a == b)
self.assertFalse(a != b)
def test_main(): def test_main():
test_support.run_unittest(ComparisonTest) test_support.run_unittest(ComparisonTest)

View File

@ -28,6 +28,9 @@ TO DO
Core and Builtins Core and Builtins
----------------- -----------------
- By default, != returns the opposite of ==, unless the latter returns
NotImplemented.
- Patch #1680961: sys.exitfunc has been removed and replaced with a private - Patch #1680961: sys.exitfunc has been removed and replaced with a private
C-level API. C-level API.

View File

@ -2314,7 +2314,22 @@ object_richcompare(PyObject *self, PyObject *other, int op)
break; break;
case Py_NE: case Py_NE:
res = (self != other) ? Py_True : Py_False; /* By default, != returns the opposite of ==,
unless the latter returns NotImplemented. */
res = PyObject_RichCompare(self, other, Py_EQ);
if (res != NULL && res != Py_NotImplemented) {
int ok = PyObject_IsTrue(res);
Py_DECREF(res);
if (ok < 0)
res = NULL;
else {
if (ok)
res = Py_False;
else
res = Py_True;
Py_INCREF(res);
}
}
break; break;
default: default: