mirror of https://github.com/python/cpython
bpo-33073: Rework int.as_integer_ratio() implementation (GH-9303)
* Simplify the C code. * Simplify tests and make them more strict and robust. * Add references in the documentation.
This commit is contained in:
parent
b981fec8d6
commit
b2e2025941
|
@ -91,8 +91,8 @@ Other Language Changes
|
|||
was lifted.
|
||||
(Contributed by Serhiy Storchaka in :issue:`32489`.)
|
||||
|
||||
* The ``int`` type now has a new ``as_integer_ratio`` method compatible
|
||||
with the existing ``float.as_integer_ratio`` method.
|
||||
* The :class:`int` type now has a new :meth:`~int.as_integer_ratio` method
|
||||
compatible with the existing :meth:`float.as_integer_ratio` method.
|
||||
(Contributed by Lisa Roach in :issue:`33073`.)
|
||||
|
||||
* Added support of ``\N{name}`` escapes in :mod:`regular expressions <re>`.
|
||||
|
|
|
@ -3,7 +3,6 @@ from test import support
|
|||
|
||||
import sys
|
||||
|
||||
import enum
|
||||
import random
|
||||
import math
|
||||
import array
|
||||
|
@ -1354,35 +1353,14 @@ class LongTest(unittest.TestCase):
|
|||
self.assertEqual(type(value >> shift), int)
|
||||
|
||||
def test_as_integer_ratio(self):
|
||||
tests = [10, 0, -10, 1]
|
||||
class myint(int):
|
||||
pass
|
||||
tests = [10, 0, -10, 1, sys.maxsize + 1, True, False, myint(42)]
|
||||
for value in tests:
|
||||
numerator, denominator = value.as_integer_ratio()
|
||||
self.assertEqual((numerator, denominator), (value, 1))
|
||||
self.assertIsInstance(numerator, int)
|
||||
self.assertIsInstance(denominator, int)
|
||||
|
||||
def test_as_integer_ratio_maxint(self):
|
||||
x = sys.maxsize + 1
|
||||
self.assertEqual(x.as_integer_ratio()[0], x)
|
||||
|
||||
def test_as_integer_ratio_bool(self):
|
||||
self.assertEqual(True.as_integer_ratio(), (1, 1))
|
||||
self.assertEqual(False.as_integer_ratio(), (0, 1))
|
||||
self.assertEqual(type(True.as_integer_ratio()[0]), int)
|
||||
self.assertEqual(type(False.as_integer_ratio()[0]), int)
|
||||
|
||||
def test_as_integer_ratio_int_enum(self):
|
||||
class Foo(enum.IntEnum):
|
||||
X = 42
|
||||
self.assertEqual(Foo.X.as_integer_ratio(), (42, 1))
|
||||
self.assertEqual(type(Foo.X.as_integer_ratio()[0]), int)
|
||||
|
||||
def test_as_integer_ratio_int_flag(self):
|
||||
class Foo(enum.IntFlag):
|
||||
R = 1 << 2
|
||||
self.assertEqual(Foo.R.as_integer_ratio(), (4, 1))
|
||||
self.assertEqual(type(Foo.R.as_integer_ratio()[0]), int)
|
||||
|
||||
self.assertEqual((numerator, denominator), (int(value), 1))
|
||||
self.assertEqual(type(numerator), int)
|
||||
self.assertEqual(type(denominator), int)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -5280,13 +5280,8 @@ static PyObject *
|
|||
int_as_integer_ratio_impl(PyObject *self)
|
||||
/*[clinic end generated code: output=e60803ae1cc8621a input=55ce3058e15de393]*/
|
||||
{
|
||||
PyObject *numerator;
|
||||
PyObject *ratio_tuple;
|
||||
|
||||
if (PyLong_CheckExact(self)) {
|
||||
return PyTuple_Pack(2, self, _PyLong_One);
|
||||
}
|
||||
numerator = _PyLong_Copy((PyLongObject *) self);
|
||||
PyObject *numerator = long_long(self);
|
||||
if (numerator == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue