Index: Objects/rangeobject.c =================================================================== --- Objects/rangeobject.c (revision 62257) +++ Objects/rangeobject.c (working copy) @@ -252,6 +252,34 @@ r->start, r->stop, r->step); } +static PyObject * +range_richcompare(PyObject *v, PyObject *w, int op) +{ + if (!PyRange_Check(v) + || !PyRange_Check(w) + || (op != Py_EQ + && op != Py_NE)) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + rangeobject *us = (rangeobject*)v; + rangeobject *them = (rangeobject*)w; + + int is_equal = ( + PyObject_IsTrue(PyObject_RichCompare(us->start, them->start, Py_EQ)) + && PyObject_IsTrue(PyObject_RichCompare(us->stop, them->stop, Py_EQ)) + && PyObject_IsTrue(PyObject_RichCompare(us->step, them->step, Py_EQ)) + ); + if ((is_equal && op == Py_EQ) + || (!is_equal && op == Py_NE)) { + Py_RETURN_TRUE; + } + else { + Py_RETURN_FALSE; + } +} + static PySequenceMethods range_as_sequence = { (lenfunc)range_length, /* sq_length */ 0, /* sq_concat */ @@ -296,7 +324,7 @@ range_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + range_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ range_iter, /* tp_iter */ 0, /* tp_iternext */ Index: Lib/test/test_builtin.py =================================================================== --- Lib/test/test_builtin.py (revision 62257) +++ Lib/test/test_builtin.py (working copy) @@ -1594,6 +1594,10 @@ #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize) self.assertRaises(OverflowError, len, range(0, sys.maxsize**10)) + + self.assertEquals(range(1234), range(1234)) + self.assertEquals(range(4, 3, 2), range(4, 3, 2)) + self.assertNotEquals(range(1, 15, 3), range(1, 20, 3)) def test_input(self): self.write_testfile()