]> granicus.if.org Git - python/commitdiff
bpo-33203: Ensure random.choice always raises IndexError on empty sequence (GH-6338)
authorWolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de>
Thu, 5 Apr 2018 15:19:44 +0000 (17:19 +0200)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>
Thu, 5 Apr 2018 15:19:44 +0000 (08:19 -0700)
Lib/random.py
Lib/test/test_random.py
Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst [new file with mode: 0644]

index 91065b7e3037843fac2f2271afed1d234acea14c..0bc24174e13f14f65c2dbe8d05379d0ae4b34a3b 100644 (file)
@@ -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()
index 468c4a467e5df5a09158d97f5a3ca51504bcbdce..eee245df48a161d1ec89e6bef4b7dd783784f913 100644 (file)
@@ -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 (file)
index 0000000..ab6d17b
--- /dev/null
@@ -0,0 +1,3 @@
+``random.Random.choice()`` now raises ``IndexError`` for empty sequences
+consistently even when called from subclasses without a ``getrandbits()``
+implementation.