[Python-3000-checkins] r54588 - in python/branches/p3yk: Lib/test/test_compare.py Misc/NEWS Objects/typeobject.c
guido.van.rossum
python-3000-checkins at python.org
Wed Mar 28 00:37:39 CEST 2007
Author: guido.van.rossum
Date: Wed Mar 28 00:37:34 2007
New Revision: 54588
Modified:
python/branches/p3yk/Lib/test/test_compare.py
python/branches/p3yk/Misc/NEWS
python/branches/p3yk/Objects/typeobject.c
Log:
By default, != returns the opposite of ==, unless the latter returns
NotImplemented.
(Is this worth backporting to 2.6? It seems so useful...!)
Modified: python/branches/p3yk/Lib/test/test_compare.py
==============================================================================
--- python/branches/p3yk/Lib/test/test_compare.py (original)
+++ python/branches/p3yk/Lib/test/test_compare.py Wed Mar 28 00:37:34 2007
@@ -39,6 +39,12 @@
self.assertEqual(a == b, id(a) == id(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():
test_support.run_unittest(ComparisonTest)
Modified: python/branches/p3yk/Misc/NEWS
==============================================================================
--- python/branches/p3yk/Misc/NEWS (original)
+++ python/branches/p3yk/Misc/NEWS Wed Mar 28 00:37:34 2007
@@ -28,6 +28,9 @@
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
C-level API.
Modified: python/branches/p3yk/Objects/typeobject.c
==============================================================================
--- python/branches/p3yk/Objects/typeobject.c (original)
+++ python/branches/p3yk/Objects/typeobject.c Wed Mar 28 00:37:34 2007
@@ -2314,7 +2314,22 @@
break;
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;
default:
More information about the Python-3000-checkins
mailing list