bpo-42772: Step argument ignored when stop is None. (GH-24018)

This commit is contained in:
Raymond Hettinger 2021-01-02 10:24:51 -08:00 committed by GitHub
parent 607501abb4
commit 768fa145cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 1 deletions

View File

@ -96,6 +96,7 @@ LOG4 = _log(4.0)
SG_MAGICCONST = 1.0 + _log(4.5) SG_MAGICCONST = 1.0 + _log(4.5)
BPF = 53 # Number of bits in a float BPF = 53 # Number of bits in a float
RECIP_BPF = 2 ** -BPF RECIP_BPF = 2 ** -BPF
_ONE = 1
class Random(_random.Random): class Random(_random.Random):
@ -288,7 +289,7 @@ class Random(_random.Random):
## -------------------- integer methods ------------------- ## -------------------- integer methods -------------------
def randrange(self, start, stop=None, step=1): def randrange(self, start, stop=None, step=_ONE):
"""Choose a random item from range(start, stop[, step]). """Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the This fixes the problem with randint() which includes the
@ -311,7 +312,12 @@ class Random(_random.Random):
_warn('randrange() will raise TypeError in the future', _warn('randrange() will raise TypeError in the future',
DeprecationWarning, 2) DeprecationWarning, 2)
raise ValueError("non-integer arg 1 for randrange()") raise ValueError("non-integer arg 1 for randrange()")
if stop is None: if stop is None:
# We don't check for "step != 1" because it hasn't been
# type checked and converted to an integer yet.
if step is not _ONE:
raise TypeError('Missing a non-None stop argument')
if istart > 0: if istart > 0:
return self._randbelow(istart) return self._randbelow(istart)
raise ValueError("empty range for randrange()") raise ValueError("empty range for randrange()")

View File

@ -562,6 +562,14 @@ class SystemRandom_TestBasicOps(TestBasicOps, unittest.TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
randrange(10, 20, 1.5) randrange(10, 20, 1.5)
def test_randrange_step(self):
# bpo-42772: When stop is None, the step argument was being ignored.
randrange = self.gen.randrange
with self.assertRaises(TypeError):
randrange(1000, step=100)
with self.assertRaises(TypeError):
randrange(1000, None, step=100)
def test_randbelow_logic(self, _log=log, int=int): def test_randbelow_logic(self, _log=log, int=int):
# check bitcount transition points: 2**i and 2**(i+1)-1 # check bitcount transition points: 2**i and 2**(i+1)-1
# show that: k = int(1.001 + _log(n, 2)) # show that: k = int(1.001 + _log(n, 2))

View File

@ -0,0 +1,2 @@
randrange() now raises a TypeError when step is specified without a stop
argument. Formerly, it silently ignored the step argument.