bpo-40325: Deprecate set object support in random.sample() (GH-19591)

This commit is contained in:
Raymond Hettinger 2020-04-19 00:36:42 -07:00 committed by GitHub
parent 482259d0dc
commit 4fe002045f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 2 deletions

View File

@ -230,6 +230,13 @@ Functions for sequences
If the sample size is larger than the population size, a :exc:`ValueError`
is raised.
.. deprecated:: 3.9
In the future, the *population* must be a sequence. Instances of
:class:`set` are no longer supported. The set must first be converted
to a :class:`list` or :class:`tuple`, preferably in a deterministic
order so that the sample is reproducible.
Real-valued distributions
-------------------------

View File

@ -367,9 +367,12 @@ class Random(_random.Random):
# 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 or set. For dicts, use list(d).")
raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).")
randbelow = self._randbelow
n = len(population)
if not 0 <= k <= n:

View File

@ -147,7 +147,6 @@ class TestBasicOps:
def test_sample_inputs(self):
# SF bug #801342 -- population can be any iterable defining __len__()
self.gen.sample(set(range(20)), 2)
self.gen.sample(range(20), 2)
self.gen.sample(range(20), 2)
self.gen.sample(str('abcdefghijklmnopqrst'), 2)
@ -156,6 +155,11 @@ class TestBasicOps:
def test_sample_on_dicts(self):
self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2)
def test_sample_on_sets(self):
with self.assertWarns(DeprecationWarning):
population = {10, 20, 30, 40, 50, 60, 70}
self.gen.sample(population, k=5)
def test_choices(self):
choices = self.gen.choices
data = ['red', 'green', 'blue', 'yellow']

View File

@ -0,0 +1 @@
Deprecated support for set objects in random.sample().