Index: Objects/object.c =================================================================== --- Objects/object.c (revision 67187) +++ Objects/object.c (working copy) @@ -687,6 +687,15 @@ PyObject *res; int ok; + /* Quick result when objects are the same. + Guarantees that identity implies equality. */ + if (v == w) { + if (op == Py_EQ) + return 1; + else if (op == Py_NE) + return 0; + } + res = PyObject_RichCompare(v, w, op); if (res == NULL) return -1; Index: Misc/NEWS =================================================================== --- Misc/NEWS (revision 67187) +++ Misc/NEWS (working copy) @@ -13,6 +13,10 @@ Core and Builtins ----------------- +- Issue #4296: Fix PyObject_RichCompareBool so that "x in [x]" evaluates to + True, even when x doesn't compare equal to itself. This was a regression + from 2.6. + Library ------- Index: Lib/test/test_float.py =================================================================== --- Lib/test/test_float.py (revision 67187) +++ Lib/test/test_float.py (working copy) @@ -117,6 +117,33 @@ self.assertRaises(OverflowError, float('-inf').as_integer_ratio) self.assertRaises(ValueError, float('nan').as_integer_ratio) + def test_float_containment(self): + floats = (INF, -INF, 0.0, 1.0, NAN) + for f in floats: + self.assert_(f in [f], "'%r' not in []" % f) + self.assert_(f in (f,), "'%r' not in ()" % f) + self.assert_(f in {f}, "'%r' not in set()" % f) + self.assert_(f in {f: None}, "'%r' not in {}" % f) + self.assertEqual([f].count(f), 1, "[].count('%r') != 1" % f) + self.assert_(f in floats, "'%r' not in container" % f) + + for f in floats: + # nonidentical containers, same type, same contents + self.assert_([f] == [f], "[%r] != [%r]" % (f, f)) + self.assert_((f,) == (f,), "(%r,) != (%r,)" % (f, f)) + self.assert_({f} == {f}, "{%r} != {%r}" % (f, f)) + self.assert_({f : None} == {f: None}, "{%r : None} != " + "{%r : None}" % (f, f)) + + # identical containers + l, t, s, d = [f], (f,), {f}, {f: None} + self.assert_(l == l, "[%r] not equal to itself" % f) + self.assert_(t == t, "(%r,) not equal to itself" % f) + self.assert_(s == s, "{%r} not equal to itself" % f) + self.assert_(d == d, "{%r : None} not equal to itself" % f) + + + class FormatFunctionsTestCase(unittest.TestCase): def setUp(self):