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

This commit is contained in:
Mark Dickinson 2010-03-13 09:48:39 +00:00
parent ad0ef571b7
commit f673f0c40c
4 changed files with 24 additions and 11 deletions

View file

@ -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)

View file

@ -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):
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

View file

@ -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

View file

@ -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))