[Python-checkins] bpo-33073: Rework int.as_integer_ratio() implementation (GH-9303)

Victor Stinner webhook-mailer at python.org
Fri Oct 19 17:46:34 EDT 2018


https://github.com/python/cpython/commit/b2e2025941f6a4fdb716bd141d31acf720353d21
commit: b2e2025941f6a4fdb716bd141d31acf720353d21
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: Victor Stinner <vstinner at redhat.com>
date: 2018-10-19T23:46:31+02:00
summary:

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.

files:
M Doc/whatsnew/3.8.rst
M Lib/test/test_long.py
M Objects/longobject.c

diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index e522addf391f..93dd24acaa8a 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -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>`.
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 5b860dd36bc0..53101b3badb3 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -3,7 +3,6 @@
 
 import sys
 
-import enum
 import random
 import math
 import array
@@ -1354,35 +1353,14 @@ def test_shift_bool(self):
                 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__":
diff --git a/Objects/longobject.c b/Objects/longobject.c
index ae3a98cc791c..6f7fe335d9f2 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -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;
     }



More information about the Python-checkins mailing list