diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 07ee0115214296..9d85c2b9958eb2 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -141,8 +141,9 @@ Functions for integers ``randrange(10)``. In the future, this will raise a :exc:`TypeError`. .. deprecated:: 3.10 - The exception raised for non-integral values such as ``range(10.5)`` - will be changed from :exc:`ValueError` to :exc:`TypeError`. + The exception raised for non-integral values such as ``randrange(10.5)`` + or ``randrange('10')`` will be changed from :exc:`ValueError` to + :exc:`TypeError`. .. function:: randint(a, b) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index d822dda09d2e17..70d17600f2d201 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -526,6 +526,10 @@ Deprecated as appropriate to help identify code which needs updating during this transition. +* Non-integer arguments to :func:`random.randrange` are deprecated. + The :exc:`ValueError` is deprecated in favor of a :exc:`TypeError`. + (Contributed by Serhiy Storchaka and Raymond Hettinger in :issue:`37319`.) + * The various ``load_module()`` methods of :mod:`importlib` have been documented as deprecated since Python 3.6, but will now also trigger a :exc:`DeprecationWarning`. Use diff --git a/Lib/random.py b/Lib/random.py index 30186fc7a3b507..187b0a016947a8 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -303,17 +303,15 @@ def randrange(self, start, stop=None, step=_ONE): try: istart = _index(start) except TypeError: - if int(start) == start: - istart = int(start) - _warn('Float arguments to randrange() have been deprecated\n' - 'since Python 3.10 and will be removed in a subsequent ' - 'version.', - DeprecationWarning, 2) - else: + istart = int(start) + if istart != start: _warn('randrange() will raise TypeError in the future', DeprecationWarning, 2) raise ValueError("non-integer arg 1 for randrange()") - + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) if stop is None: # We don't check for "step != 1" because it hasn't been # type checked and converted to an integer yet. @@ -327,31 +325,29 @@ def randrange(self, start, stop=None, step=_ONE): try: istop = _index(stop) except TypeError: - if int(stop) == stop: - istop = int(stop) - _warn('Float arguments to randrange() have been deprecated\n' - 'since Python 3.10 and will be removed in a subsequent ' - 'version.', - DeprecationWarning, 2) - else: + istop = int(stop) + if istop != stop: _warn('randrange() will raise TypeError in the future', DeprecationWarning, 2) raise ValueError("non-integer stop for randrange()") - + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) + width = istop - istart try: istep = _index(step) except TypeError: - if int(step) == step: - istep = int(step) - _warn('Float arguments to randrange() have been deprecated\n' - 'since Python 3.10 and will be removed in a subsequent ' - 'version.', - DeprecationWarning, 2) - else: + istep = int(step) + if istep != step: _warn('randrange() will raise TypeError in the future', DeprecationWarning, 2) raise ValueError("non-integer step for randrange()") - width = istop - istart + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) + # Fast path. if istep == 1: if width > 0: return istart + self._randbelow(width) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 35ae4e6c3c80ce..66908868a6e9ef 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -509,11 +509,24 @@ def test_randrange_errors(self): raises(-721) raises(0, 100, -12) # Non-integer start/stop - raises(3.14159) - raises(0, 2.71828) + self.assertWarns(DeprecationWarning, raises, 3.14159) + self.assertWarns(DeprecationWarning, self.gen.randrange, 3.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, Fraction(3, 1)) + self.assertWarns(DeprecationWarning, raises, '3') + self.assertWarns(DeprecationWarning, raises, 0, 2.71828) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 2.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, Fraction(2, 1)) + self.assertWarns(DeprecationWarning, raises, 0, '2') # Zero and non-integer step raises(0, 42, 0) - raises(0, 42, 3.14159) + self.assertWarns(DeprecationWarning, raises, 0, 42, 0.0) + self.assertWarns(DeprecationWarning, raises, 0, 0, 0.0) + self.assertWarns(DeprecationWarning, raises, 0, 42, 3.14159) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 3.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, Fraction(3, 1)) + self.assertWarns(DeprecationWarning, raises, 0, 42, '3') + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 1.0) + self.assertWarns(DeprecationWarning, raises, 0, 0, 1.0) def test_randrange_argument_handling(self): randrange = self.gen.randrange diff --git a/Misc/NEWS.d/3.10.0a4.rst b/Misc/NEWS.d/3.10.0a4.rst index 882e03d82169a9..57da9254587b44 100644 --- a/Misc/NEWS.d/3.10.0a4.rst +++ b/Misc/NEWS.d/3.10.0a4.rst @@ -605,12 +605,12 @@ deprecated in Python 3.7. Patch by Erlend E. Aasland .. nonce: Cfl1eR .. section: Library -Harmonized random.randrange() argument handling to match range(). +Harmonized :func:`random.randrange` argument handling to match :func:`range`. -* The integer test and conversion in randrange() now uses - operator.index(). -* Non-integer arguments to randrange() are deprecated. -* The *ValueError* is deprecated in favor of a *TypeError*. +* The integer test and conversion in ``randrange()`` now uses + :func:`operator.index`. +* Non-integer arguments to ``randrange()`` are deprecated. +* The ``ValueError`` is deprecated in favor of a ``TypeError``. * It now runs a little faster than before. (Contributed by Raymond Hettinger and Serhiy Storchaka.)
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: