Commit f673f0c4 authored by Mark Dickinson's avatar Mark Dickinson

Issue #7845: Make 1j.__le__(2j) return NotImplemented rather than raising TypeError.

parent ad0ef571
...@@ -168,8 +168,9 @@ Objects of different types, except different numeric types, never compare equal. ...@@ -168,8 +168,9 @@ Objects of different types, except different numeric types, never compare equal.
Furthermore, some types (for example, function objects) support only a degenerate Furthermore, some types (for example, function objects) support only a degenerate
notion of comparison where any two objects of that type are unequal. The ``<``, notion of comparison where any two objects of that type are unequal. The ``<``,
``<=``, ``>`` and ``>=`` operators will raise a :exc:`TypeError` exception when ``<=``, ``>`` and ``>=`` operators will raise a :exc:`TypeError` exception when
any operand is a complex number, the objects are of different types that cannot comparing a complex number with another built-in numeric type, when the objects
be compared, or other cases where there is no defined ordering. are of different types that cannot be compared, or in other cases where there is
no defined ordering.
.. index:: .. index::
single: __eq__() (instance method) single: __eq__() (instance method)
......
...@@ -3,6 +3,7 @@ from test import support ...@@ -3,6 +3,7 @@ from test import support
from random import random from random import random
from math import atan2, isnan, copysign from math import atan2, isnan, copysign
import operator
INF = float("inf") INF = float("inf")
NAN = float("nan") NAN = float("nan")
...@@ -110,15 +111,23 @@ class ComplexTest(unittest.TestCase): ...@@ -110,15 +111,23 @@ class ComplexTest(unittest.TestCase):
def test_richcompare(self): def test_richcompare(self):
self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1<<10000) self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1<<10000)
self.assertEqual(complex.__lt__(1+1j, None), NotImplemented) self.assertIs(complex.__lt__(1+1j, None), NotImplemented)
self.assertIs(complex.__eq__(1+1j, 1+1j), True) self.assertIs(complex.__eq__(1+1j, 1+1j), True)
self.assertIs(complex.__eq__(1+1j, 2+2j), False) self.assertIs(complex.__eq__(1+1j, 2+2j), False)
self.assertIs(complex.__ne__(1+1j, 1+1j), False) self.assertIs(complex.__ne__(1+1j, 1+1j), False)
self.assertIs(complex.__ne__(1+1j, 2+2j), True) self.assertIs(complex.__ne__(1+1j, 2+2j), True)
self.assertRaises(TypeError, complex.__lt__, 1+1j, 2+2j) self.assertIs(complex.__lt__(1+1j, 2+2j), NotImplemented)
self.assertRaises(TypeError, complex.__le__, 1+1j, 2+2j) self.assertIs(complex.__le__(1+1j, 2+2j), NotImplemented)
self.assertRaises(TypeError, complex.__gt__, 1+1j, 2+2j) self.assertIs(complex.__gt__(1+1j, 2+2j), NotImplemented)
self.assertRaises(TypeError, complex.__ge__, 1+1j, 2+2j) self.assertIs(complex.__ge__(1+1j, 2+2j), NotImplemented)
self.assertRaises(TypeError, operator.lt, 1+1j, 2+2j)
self.assertRaises(TypeError, operator.le, 1+1j, 2+2j)
self.assertRaises(TypeError, operator.gt, 1+1j, 2+2j)
self.assertRaises(TypeError, operator.ge, 1+1j, 2+2j)
self.assertIs(operator.eq(1+1j, 1+1j), True)
self.assertIs(operator.eq(1+1j, 2+2j), False)
self.assertIs(operator.ne(1+1j, 1+1j), False)
self.assertIs(operator.ne(1+1j, 2+2j), True)
def test_mod(self): def test_mod(self):
# % is no longer supported on complex numbers # % is no longer supported on complex numbers
......
...@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1? ...@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #7845: Rich comparison methods on the complex type now return
NotImplemented rather than raising a TypeError when comparing with an
incompatible type; this allows user-defined classes to implement their own
comparisons with complex.
- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt - Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
(SIGINT). If an error occurs while importing the site module, the error is (SIGINT). If an error occurs while importing the site module, the error is
printed and Python exits. Initialize the GIL before importing the site printed and Python exits. Initialize the GIL before importing the site
......
...@@ -625,10 +625,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op) ...@@ -625,10 +625,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op)
TO_COMPLEX(w, j); TO_COMPLEX(w, j);
if (op != Py_EQ && op != Py_NE) { if (op != Py_EQ && op != Py_NE) {
/* XXX Should eventually return NotImplemented */ Py_INCREF(Py_NotImplemented);
PyErr_SetString(PyExc_TypeError, return Py_NotImplemented;
"no ordering relation is defined for complex numbers");
return NULL;
} }
if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ)) if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment