Issue #5211: Complete removal of implicit coercions for the complex

type.  Coercion for arithmetic operations was already removed in
r78280, but that commit didn't remove coercion for rich comparisons.
This commit is contained in:
Mark Dickinson 2010-05-30 12:12:25 +00:00
parent ddac33882b
commit 813363743d
3 changed files with 19 additions and 19 deletions

View file

@ -115,6 +115,19 @@ class ComplexTest(unittest.TestCase):
def test_coerce(self): def test_coerce(self):
self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000)
def test_no_implicit_coerce(self):
# Python 2.7 removed implicit coercion from the complex type
class A(object):
def __coerce__(self, other):
raise RuntimeError
__hash__ = None
def __cmp__(self, other):
return -1
a = A()
self.assertRaises(TypeError, lambda: a + 2.0j)
self.assertTrue(a < 2.0j)
def test_richcompare(self): def test_richcompare(self):
self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000) self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000)
self.assertEqual(complex.__lt__(1+1j, None), NotImplemented) self.assertEqual(complex.__lt__(1+1j, None), NotImplemented)

View file

@ -12,6 +12,10 @@ What's New in Python 2.7 Release Candidate 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #5211: Implicit coercion for the complex type is now completely
removed. (Coercion for arithmetic operations was already removed in 2.7
alpha 4, but coercion for rich comparisons was accidentally left in.)
- Issue #3798: Write sys.exit() message to sys.stderr to use stderr encoding - Issue #3798: Write sys.exit() message to sys.stderr to use stderr encoding
and error handler, instead of writing to the C stderr file in utf-8 and error handler, instead of writing to the C stderr file in utf-8

View file

@ -787,25 +787,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op)
Py_complex i, j; Py_complex i, j;
PyObject *res; PyObject *res;
c = PyNumber_CoerceEx(&v, &w); TO_COMPLEX(v, i);
if (c < 0) TO_COMPLEX(w, j);
return NULL;
if (c > 0) {
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
/* Make sure both arguments are complex. */
if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Py_DECREF(v);
Py_DECREF(w);
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
i = ((PyComplexObject *)v)->cval;
j = ((PyComplexObject *)w)->cval;
Py_DECREF(v);
Py_DECREF(w);
if (op != Py_EQ && op != Py_NE) { if (op != Py_EQ && op != Py_NE) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,