|
51 | 51 | from math import tau as TWOPI, floor as _floor, isfinite as _isfinite
|
52 | 52 | from os import urandom as _urandom
|
53 | 53 | from _collections_abc import Set as _Set, Sequence as _Sequence
|
| 54 | +from operator import index as _index |
54 | 55 | from itertools import accumulate as _accumulate, repeat as _repeat
|
55 | 56 | from bisect import bisect as _bisect
|
56 | 57 | import os as _os
|
@@ -297,28 +298,59 @@ def randrange(self, start, stop=None, step=1):
|
297 | 298 |
|
298 | 299 | # This code is a bit messy to make it fast for the
|
299 | 300 | # common case while still doing adequate error checking.
|
300 |
| - istart = int(start) |
301 |
| - if istart != start: |
302 |
| - raise ValueError("non-integer arg 1 for randrange()") |
| 301 | + try: |
| 302 | + istart = _index(start) |
| 303 | + except TypeError: |
| 304 | + if int(start) == start: |
| 305 | + istart = int(start) |
| 306 | + _warn('Float arguments to randrange() have been deprecated\n' |
| 307 | + 'since Python 3.10 and will be removed in a subsequent ' |
| 308 | + 'version.', |
| 309 | + DeprecationWarning, 2) |
| 310 | + else: |
| 311 | + _warn('randrange() will raise TypeError in the future', |
| 312 | + DeprecationWarning, 2) |
| 313 | + raise ValueError("non-integer arg 1 for randrange()") |
303 | 314 | if stop is None:
|
304 | 315 | if istart > 0:
|
305 | 316 | return self._randbelow(istart)
|
306 | 317 | raise ValueError("empty range for randrange()")
|
307 | 318 |
|
308 | 319 | # stop argument supplied.
|
309 |
| - istop = int(stop) |
310 |
| - if istop != stop: |
311 |
| - raise ValueError("non-integer stop for randrange()") |
| 320 | + try: |
| 321 | + istop = _index(stop) |
| 322 | + except TypeError: |
| 323 | + if int(stop) == stop: |
| 324 | + istop = int(stop) |
| 325 | + _warn('Float arguments to randrange() have been deprecated\n' |
| 326 | + 'since Python 3.10 and will be removed in a subsequent ' |
| 327 | + 'version.', |
| 328 | + DeprecationWarning, 2) |
| 329 | + else: |
| 330 | + _warn('randrange() will raise TypeError in the future', |
| 331 | + DeprecationWarning, 2) |
| 332 | + raise ValueError("non-integer stop for randrange()") |
| 333 | + |
| 334 | + try: |
| 335 | + istep = _index(step) |
| 336 | + except TypeError: |
| 337 | + if int(step) == step: |
| 338 | + istep = int(step) |
| 339 | + _warn('Float arguments to randrange() have been deprecated\n' |
| 340 | + 'since Python 3.10 and will be removed in a subsequent ' |
| 341 | + 'version.', |
| 342 | + DeprecationWarning, 2) |
| 343 | + else: |
| 344 | + _warn('randrange() will raise TypeError in the future', |
| 345 | + DeprecationWarning, 2) |
| 346 | + raise ValueError("non-integer step for randrange()") |
312 | 347 | width = istop - istart
|
313 |
| - if step == 1 and width > 0: |
| 348 | + if istep == 1 and width > 0: |
314 | 349 | return istart + self._randbelow(width)
|
315 |
| - if step == 1: |
| 350 | + if istep == 1: |
316 | 351 | raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
|
317 | 352 |
|
318 | 353 | # Non-unit step argument supplied.
|
319 |
| - istep = int(step) |
320 |
| - if istep != step: |
321 |
| - raise ValueError("non-integer step for randrange()") |
322 | 354 | if istep > 0:
|
323 | 355 | n = (width + istep - 1) // istep
|
324 | 356 | elif istep < 0:
|
|
0 commit comments