Skip to content

Commit

Permalink
bpo-42470: Do not warn on sequences which are also sets in random.sam…
Browse files Browse the repository at this point in the history
…ple() (pythonGH-23665)
  • Loading branch information
masklinn authored Dec 19, 2020
1 parent e009612 commit 1e27b57
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 7 deletions.
13 changes: 7 additions & 6 deletions Lib/random.py
Original file line number Diff line number Diff line change
Expand Up @@ -424,13 +424,14 @@ def sample(self, population, k, *, counts=None):
# too many calls to _randbelow(), making them slower and
# causing them to eat more entropy than necessary.

if isinstance(population, _Set):
_warn('Sampling from a set deprecated\n'
'since Python 3.9 and will be removed in a subsequent version.',
DeprecationWarning, 2)
population = tuple(population)
if not isinstance(population, _Sequence):
raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).")
if isinstance(population, _Set):
_warn('Sampling from a set deprecated\n'
'since Python 3.9 and will be removed in a subsequent version.',
DeprecationWarning, 2)
population = tuple(population)
else:
raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).")
n = len(population)
if counts is not None:
cum_counts = list(_accumulate(counts))
Expand Down
18 changes: 17 additions & 1 deletion Lib/test/test_random.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from math import log, exp, pi, fsum, sin, factorial
from test import support
from fractions import Fraction
from collections import Counter
from collections import abc, Counter

class TestBasicOps:
# Superclass with tests common to all generators.
Expand Down Expand Up @@ -163,6 +163,22 @@ def test_sample_on_sets(self):
population = {10, 20, 30, 40, 50, 60, 70}
self.gen.sample(population, k=5)

def test_sample_on_seqsets(self):
class SeqSet(abc.Sequence, abc.Set):
def __init__(self, items):
self._items = items

def __len__(self):
return len(self._items)

def __getitem__(self, index):
return self._items[index]

population = SeqSet([2, 4, 1, 3])
with warnings.catch_warnings():
warnings.simplefilter("error", DeprecationWarning)
self.gen.sample(population, k=2)

def test_sample_with_counts(self):
sample = self.gen.sample

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:func:`random.sample` no longer warns on a sequence which is also a set.

0 comments on commit 1e27b57

Please sign in to comment.