From 65014ea01a68a6115ff124d8a4e791a41bc2b28d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Jan 2020 11:02:51 +0100 Subject: [PATCH] bpo-39350: Remove deprecated fractions.gcd() (GH-18021) Remove fractions.gcd() function, deprecated since Python 3.5 (bpo-22486): use math.gcd() instead. --- Doc/library/fractions.rst | 12 --------- Doc/whatsnew/3.9.rst | 4 +++ Lib/fractions.py | 24 +---------------- Lib/test/test_fractions.py | 27 ++----------------- .../2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst | 2 ++ 5 files changed, 9 insertions(+), 60 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 58e7126b0bf212..d3a42762e3ff8d 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -172,18 +172,6 @@ another rational number, or from a string. method can also be accessed through the :func:`round` function. -.. function:: gcd(a, b) - - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the absolute value of ``gcd(a, b)`` is the - largest integer that divides both *a* and *b*. ``gcd(a,b)`` has the same - sign as *b* if *b* is nonzero; otherwise it takes the sign of *a*. ``gcd(0, - 0)`` returns ``0``. - - .. deprecated:: 3.5 - Use :func:`math.gcd` instead. - - .. seealso:: Module :mod:`numbers` diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 47e8a37e56c321..8ca755645d66fe 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -416,6 +416,10 @@ Removed :func:`base64.decodebytes` instead. (Contributed by Victor Stinner in :issue:`39351`.) +* ``fractions.gcd()`` function has been removed, it was deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + (Contributed by Victor Stinner in :issue:`39350`.) + Porting to Python 3.9 ===================== diff --git a/Lib/fractions.py b/Lib/fractions.py index 2e7047a81844d2..501f4b74a0b7ac 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -10,31 +10,9 @@ import re import sys -__all__ = ['Fraction', 'gcd'] +__all__ = ['Fraction'] - -def gcd(a, b): - """Calculate the Greatest Common Divisor of a and b. - - Unless b==0, the result will have the same sign as b (so that when - b is divided by it, the result comes out positive). - """ - import warnings - warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.', - DeprecationWarning, 2) - if type(a) is int is type(b): - if (b or a) < 0: - return -math.gcd(a, b) - return math.gcd(a, b) - return _gcd(a, b) - -def _gcd(a, b): - # Supports non-integers for backward compatibility. - while b: - a, b = b, a%b - return a - # Constants related to the hash implementation; hash(x) is based # on the reduction of x modulo the prime _PyHASH_MODULUS. _PyHASH_MODULUS = sys.hash_info.modulus diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 18ab28cfebe0c8..7cf7899932b34d 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -12,7 +12,7 @@ from copy import copy, deepcopy from pickle import dumps, loads F = fractions.Fraction -gcd = fractions.gcd + class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -81,30 +81,6 @@ def __float__(self): class DummyFraction(fractions.Fraction): """Dummy Fraction subclass for copy and deepcopy testing.""" -class GcdTest(unittest.TestCase): - - def testMisc(self): - # fractions.gcd() is deprecated - with self.assertWarnsRegex(DeprecationWarning, r'fractions\.gcd'): - gcd(1, 1) - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', r'fractions\.gcd', - DeprecationWarning) - self.assertEqual(0, gcd(0, 0)) - self.assertEqual(1, gcd(1, 0)) - self.assertEqual(-1, gcd(-1, 0)) - self.assertEqual(1, gcd(0, 1)) - self.assertEqual(-1, gcd(0, -1)) - self.assertEqual(1, gcd(7, 1)) - self.assertEqual(-1, gcd(7, -1)) - self.assertEqual(1, gcd(-23, 15)) - self.assertEqual(12, gcd(120, 84)) - self.assertEqual(-12, gcd(84, -120)) - self.assertEqual(gcd(120.0, 84), 12.0) - self.assertEqual(gcd(120, 84.0), 12.0) - self.assertEqual(gcd(F(120), F(84)), F(12)) - self.assertEqual(gcd(F(120, 77), F(84, 55)), F(12, 385)) - def _components(r): return (r.numerator, r.denominator) @@ -690,5 +666,6 @@ def test_slots(self): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst new file mode 100644 index 00000000000000..264e52fdc518ba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst @@ -0,0 +1,2 @@ +Remove ``fractions.gcd()`` function, deprecated since Python 3.5 +(:issue:`22486`): use :func:`math.gcd` instead.