mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
Revert "bpo-26680: Incorporate is_integer in all built-in and standard library numeric types (GH-6121)" (GH-22584)
This reverts commit 58a7da9e12
.
This commit is contained in:
parent
4f3c25043d
commit
4e0ce82058
16 changed files with 24 additions and 223 deletions
|
@ -3164,12 +3164,6 @@ class Decimal(object):
|
|||
"""Return True if self is a zero; otherwise return False."""
|
||||
return not self._is_special and self._int == '0'
|
||||
|
||||
def is_integer(self):
|
||||
"""Return True is self is finite and integral; otherwise False."""
|
||||
if self._is_special:
|
||||
return False
|
||||
return self.to_integral_value(rounding=ROUND_FLOOR) == self
|
||||
|
||||
def _ln_exp_bound(self):
|
||||
"""Compute a lower bound for the adjusted exponent of self.ln().
|
||||
In other words, compute r such that self.ln() >= 10**r. Assumes
|
||||
|
@ -4665,25 +4659,6 @@ class Context(object):
|
|||
a = _convert_other(a, raiseit=True)
|
||||
return a.is_zero()
|
||||
|
||||
def is_integer(self, a):
|
||||
"""Return True if the operand is integral; otherwise return False.
|
||||
|
||||
>>> ExtendedContext.is_integer(Decimal('0'))
|
||||
True
|
||||
>>> ExtendedContext.is_integer(Decimal('2.50'))
|
||||
False
|
||||
>>> ExtendedContext.is_integer(Decimal('-0E+2'))
|
||||
True
|
||||
>>> ExtendedContext.is_integer(Decimal('-0.5'))
|
||||
False
|
||||
>>> ExtendedContext.is_integer(Decimal('NaN'))
|
||||
False
|
||||
>>> ExtendedContext.is_integer(10)
|
||||
True
|
||||
"""
|
||||
a = _convert_other(a, raiseit=True)
|
||||
return a.is_integer()
|
||||
|
||||
def ln(self, a):
|
||||
"""Returns the natural (base e) logarithm of the operand.
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ class Real(Complex):
|
|||
"""To Complex, Real adds the operations that work on real numbers.
|
||||
|
||||
In short, those are: a conversion to float, trunc(), divmod,
|
||||
is_integer, %, <, <=, >, and >=.
|
||||
%, <, <=, >, and >=.
|
||||
|
||||
Real also provides defaults for the derived operations.
|
||||
"""
|
||||
|
@ -242,17 +242,6 @@ class Real(Complex):
|
|||
"""self <= other"""
|
||||
raise NotImplementedError
|
||||
|
||||
def is_integer(self):
|
||||
"""Return True if the Real is integral; otherwise return False.
|
||||
|
||||
This default implementation can be overridden in subclasses
|
||||
for performance reasons or to deal with values such as NaN,
|
||||
which would otherwise cause an exception to be raised.
|
||||
"""
|
||||
# Although __int__ is not defined at this level, the int
|
||||
# constructor falls back to __trunc__, which we do have.
|
||||
return self == int(self)
|
||||
|
||||
# Concrete implementations of Complex abstract methods.
|
||||
def __complex__(self):
|
||||
"""complex(self) == complex(float(self), 0)"""
|
||||
|
@ -301,10 +290,6 @@ class Rational(Real):
|
|||
"""
|
||||
return self.numerator / self.denominator
|
||||
|
||||
def is_integer(self):
|
||||
"""Return True if the Rational is integral; otherwise return False."""
|
||||
return self.denominator == 1
|
||||
|
||||
|
||||
class Integral(Rational):
|
||||
"""Integral adds a conversion to int and the bit-string operations."""
|
||||
|
@ -401,8 +386,4 @@ class Integral(Rational):
|
|||
"""Integers have a denominator of 1."""
|
||||
return 1
|
||||
|
||||
def is_integer(self):
|
||||
"""Return True; all Integrals represent an integral value."""
|
||||
return True
|
||||
|
||||
Integral.register(int)
|
||||
|
|
|
@ -2346,24 +2346,6 @@ bool2096 iszero sNaN -> 0
|
|||
bool2097 iszero -sNaN -> 0
|
||||
bool2098 iszero sNaN123 -> 0
|
||||
bool2099 iszero -sNaN123 -> 0
|
||||
bool2100 is_integer -1.0 -> 1
|
||||
bool2101 is_integer 0.0 -> 1
|
||||
bool2102 is_integer 1.0 -> 1
|
||||
bool2103 is_integer 42 -> 1
|
||||
bool2104 is_integer 1e2 -> 1
|
||||
bool2105 is_integer 1.5 -> 0
|
||||
bool2106 is_integer 1e-2 -> 0
|
||||
bool2107 is_integer NaN -> 0
|
||||
bool2109 is_integer -NaN -> 0
|
||||
bool2110 is_integer NaN123 -> 0
|
||||
bool2111 is_integer -NaN123 -> 0
|
||||
bool2112 is_integer sNaN -> 0
|
||||
bool2113 is_integer -sNaN -> 0
|
||||
bool2114 is_integer sNaN123 -> 0
|
||||
bool2115 is_integer -sNaN123 -> 0
|
||||
bool2116 is_integer Infinity -> 0
|
||||
bool2117 is_integer -Infinity -> 0
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- The following tests (pwmx0 through pwmx440) are for the --
|
||||
|
|
|
@ -354,11 +354,6 @@ class BoolTest(unittest.TestCase):
|
|||
self.assertIs(type(False.real), int)
|
||||
self.assertIs(type(False.imag), int)
|
||||
|
||||
def test_always_is_integer(self):
|
||||
# Issue #26680: Incorporating number.is_integer into bool
|
||||
self.assertTrue(all(b.is_integer() for b in (False, True)))
|
||||
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(BoolTest)
|
||||
|
||||
|
|
|
@ -276,7 +276,6 @@ class IBMTestCases(unittest.TestCase):
|
|||
'is_snan',
|
||||
'is_subnormal',
|
||||
'is_zero',
|
||||
'is_integer',
|
||||
'same_quantum')
|
||||
|
||||
def read_unlimited(self, v, context):
|
||||
|
@ -2727,7 +2726,6 @@ class PythonAPItests(unittest.TestCase):
|
|||
self.assertRaises(TypeError, D(1).is_snan, context=xc)
|
||||
self.assertRaises(TypeError, D(1).is_signed, context=xc)
|
||||
self.assertRaises(TypeError, D(1).is_zero, context=xc)
|
||||
self.assertRaises(TypeError, D(1).is_integer, context=xc)
|
||||
|
||||
self.assertFalse(D("0.01").is_normal(context=xc))
|
||||
self.assertTrue(D("0.01").is_subnormal(context=xc))
|
||||
|
@ -3199,15 +3197,6 @@ class ContextAPItests(unittest.TestCase):
|
|||
self.assertEqual(c.is_zero(10), d)
|
||||
self.assertRaises(TypeError, c.is_zero, '10')
|
||||
|
||||
def test_is_integer(self):
|
||||
Decimal = self.decimal.Decimal
|
||||
Context = self.decimal.Context
|
||||
|
||||
c = Context()
|
||||
b = c.is_integer(Decimal(10))
|
||||
self.assertEqual(c.is_integer(10), b)
|
||||
self.assertRaises(TypeError, c.is_integer, '10')
|
||||
|
||||
def test_ln(self):
|
||||
Decimal = self.decimal.Decimal
|
||||
Context = self.decimal.Context
|
||||
|
@ -4371,19 +4360,6 @@ class Coverage(unittest.TestCase):
|
|||
self.assertTrue(Decimal("-1").is_signed())
|
||||
self.assertTrue(Decimal("0").is_zero())
|
||||
self.assertTrue(Decimal("0").is_zero())
|
||||
self.assertTrue(Decimal("-1").is_integer())
|
||||
self.assertTrue(Decimal("0").is_integer())
|
||||
self.assertTrue(Decimal("1").is_integer())
|
||||
self.assertTrue(Decimal("42").is_integer())
|
||||
self.assertTrue(Decimal("1e2").is_integer())
|
||||
self.assertFalse(Decimal("1.5").is_integer())
|
||||
self.assertFalse(Decimal("1e-2").is_integer())
|
||||
self.assertFalse(Decimal("NaN").is_integer())
|
||||
self.assertFalse(Decimal("-NaN").is_integer())
|
||||
self.assertFalse(Decimal("sNaN").is_integer())
|
||||
self.assertFalse(Decimal("-sNaN").is_integer())
|
||||
self.assertFalse(Decimal("Inf").is_integer())
|
||||
self.assertFalse(Decimal("-Inf").is_integer())
|
||||
|
||||
# Copy
|
||||
with localcontext() as c:
|
||||
|
|
|
@ -724,17 +724,6 @@ class FractionTest(unittest.TestCase):
|
|||
self.assertEqual(type(f.numerator), myint)
|
||||
self.assertEqual(type(f.denominator), myint)
|
||||
|
||||
def test_is_integer(self):
|
||||
# Issue #26680: Incorporating number.is_integer into Fraction
|
||||
self.assertTrue(F(-1, 1).is_integer())
|
||||
self.assertTrue(F(0, 1).is_integer())
|
||||
self.assertTrue(F(1, 1).is_integer())
|
||||
self.assertTrue(F(42, 1).is_integer())
|
||||
self.assertTrue(F(2, 2).is_integer())
|
||||
self.assertTrue(F(8, 4).is_integer())
|
||||
self.assertFalse(F(1, 2).is_integer())
|
||||
self.assertFalse(F(1, 3).is_integer())
|
||||
self.assertFalse(F(2, 3).is_integer())
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -1381,10 +1381,6 @@ class LongTest(unittest.TestCase):
|
|||
self.assertEqual(type(numerator), int)
|
||||
self.assertEqual(type(denominator), int)
|
||||
|
||||
def test_int_always_is_integer(self):
|
||||
# Issue #26680: Incorporating number.is_integer into int
|
||||
self.assertTrue(all(x.is_integer() for x in (-1, 0, 1, 42)))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -6,7 +6,6 @@ import math
|
|||
import sys
|
||||
import operator
|
||||
|
||||
from numbers import Real, Rational, Integral
|
||||
from decimal import Decimal as D
|
||||
from fractions import Fraction as F
|
||||
|
||||
|
@ -199,35 +198,5 @@ class ComparisonTest(unittest.TestCase):
|
|||
self.assertRaises(TypeError, op, v, z)
|
||||
|
||||
|
||||
class IsIntegerTest(unittest.TestCase):
|
||||
|
||||
def test_real_is_integer(self):
|
||||
self.assertTrue(Real.is_integer(-1.0))
|
||||
self.assertTrue(Real.is_integer(0.0))
|
||||
self.assertTrue(Real.is_integer(1.0))
|
||||
self.assertTrue(Real.is_integer(42.0))
|
||||
|
||||
self.assertFalse(Real.is_integer(-0.5))
|
||||
self.assertFalse(Real.is_integer(4.2))
|
||||
|
||||
def test_rational_is_integer(self):
|
||||
self.assertTrue(Rational.is_integer(F(-1, 1)))
|
||||
self.assertTrue(Rational.is_integer(F(0, 1)))
|
||||
self.assertTrue(Rational.is_integer(F(1, 1)))
|
||||
self.assertTrue(Rational.is_integer(F(42, 1)))
|
||||
self.assertTrue(Rational.is_integer(F(2, 2)))
|
||||
self.assertTrue(Rational.is_integer(F(8, 4)))
|
||||
|
||||
self.assertFalse(Rational.is_integer(F(1, 2)))
|
||||
self.assertFalse(Rational.is_integer(F(1, 3)))
|
||||
self.assertFalse(Rational.is_integer(F(2, 3)))
|
||||
|
||||
def test_integral_is_integer(self):
|
||||
self.assertTrue(Integral.is_integer(-1))
|
||||
self.assertTrue(Integral.is_integer(0))
|
||||
self.assertTrue(Integral.is_integer(1))
|
||||
self.assertTrue(Integral.is_integer(1729))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue