mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #7845: Make 1j.__le__(2j) return NotImplemented rather than raising TypeError.
This commit is contained in:
parent
ad0ef571b7
commit
f673f0c40c
4 changed files with 24 additions and 11 deletions
|
@ -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
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -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)
|
||||||
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))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue