mirror of
https://github.com/python/cpython.git
synced 2025-12-04 08:34:25 +00:00
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:
parent
ddac33882b
commit
813363743d
3 changed files with 19 additions and 19 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue