diff options
author | Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de> | 2018-04-05 15:19:44 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2018-04-05 15:19:44 (GMT) |
commit | 091e95e9004b794280ab35becec2c3e30dd5e96e (patch) | |
tree | 72be905acc5dd7a26b7a90a3d14efb58b99cbcad | |
parent | 74940913d26d9f94b8572eca794369841fa6d9b6 (diff) | |
download | cpython-091e95e9004b794280ab35becec2c3e30dd5e96e.zip cpython-091e95e9004b794280ab35becec2c3e30dd5e96e.tar.gz cpython-091e95e9004b794280ab35becec2c3e30dd5e96e.tar.bz2 |
bpo-33203: Ensure random.choice always raises IndexError on empty sequence (GH-6338)
-rw-r--r-- | Lib/random.py | 2 | ||||
-rw-r--r-- | Lib/test/test_random.py | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst | 3 |
3 files changed, 9 insertions, 1 deletions
diff --git a/Lib/random.py b/Lib/random.py index 91065b7..0bc2417 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -242,6 +242,8 @@ class Random(_random.Random): "enough bits to choose from a population range this large.\n" "To remove the range limitation, add a getrandbits() method.") return int(random() * n) + if n == 0: + raise ValueError("Boundary cannot be zero") rem = maxsize % n limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 r = random() diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 468c4a4..eee245d 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -651,7 +651,10 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase): # Population range too large (n >= maxsize) self.gen._randbelow(maxsize+1, maxsize = maxsize) self.gen._randbelow(5640, maxsize = maxsize) - + # issue 33203: test that _randbelow raises ValueError on + # n == 0 also in its getrandbits-independent branch. + with self.assertRaises(ValueError): + self.gen._randbelow(0, maxsize=maxsize) # This might be going too far to test a single line, but because of our # noble aim of achieving 100% test coverage we need to write a case in # which the following line in Random._randbelow() gets executed: diff --git a/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst b/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst new file mode 100644 index 0000000..ab6d17b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst @@ -0,0 +1,3 @@ +``random.Random.choice()`` now raises ``IndexError`` for empty sequences +consistently even when called from subclasses without a ``getrandbits()`` +implementation. |