mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
bpo-40325: Deprecate set object support in random.sample() (GH-19591)
This commit is contained in:
parent
482259d0dc
commit
4fe002045f
4 changed files with 17 additions and 2 deletions
|
@ -230,6 +230,13 @@ Functions for sequences
|
||||||
If the sample size is larger than the population size, a :exc:`ValueError`
|
If the sample size is larger than the population size, a :exc:`ValueError`
|
||||||
is raised.
|
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
|
Real-valued distributions
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|
|
@ -367,9 +367,12 @@ class Random(_random.Random):
|
||||||
# causing them to eat more entropy than necessary.
|
# causing them to eat more entropy than necessary.
|
||||||
|
|
||||||
if isinstance(population, _Set):
|
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)
|
population = tuple(population)
|
||||||
if not isinstance(population, _Sequence):
|
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
|
randbelow = self._randbelow
|
||||||
n = len(population)
|
n = len(population)
|
||||||
if not 0 <= k <= n:
|
if not 0 <= k <= n:
|
||||||
|
|
|
@ -147,7 +147,6 @@ class TestBasicOps:
|
||||||
|
|
||||||
def test_sample_inputs(self):
|
def test_sample_inputs(self):
|
||||||
# SF bug #801342 -- population can be any iterable defining __len__()
|
# 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(range(20), 2)
|
self.gen.sample(range(20), 2)
|
||||||
self.gen.sample(str('abcdefghijklmnopqrst'), 2)
|
self.gen.sample(str('abcdefghijklmnopqrst'), 2)
|
||||||
|
@ -156,6 +155,11 @@ class TestBasicOps:
|
||||||
def test_sample_on_dicts(self):
|
def test_sample_on_dicts(self):
|
||||||
self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2)
|
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):
|
def test_choices(self):
|
||||||
choices = self.gen.choices
|
choices = self.gen.choices
|
||||||
data = ['red', 'green', 'blue', 'yellow']
|
data = ['red', 'green', 'blue', 'yellow']
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Deprecated support for set objects in random.sample().
|
Loading…
Add table
Add a link
Reference in a new issue