bpo-42470: Do not warn on sequences which are also sets in random.sample() (GH-23665)
This commit is contained in:
parent
e009612476
commit
1e27b57dbc
|
@ -424,13 +424,14 @@ class Random(_random.Random):
|
||||||
# too many calls to _randbelow(), making them slower and
|
# too many calls to _randbelow(), making them slower and
|
||||||
# causing them to eat more entropy than necessary.
|
# 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):
|
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)
|
n = len(population)
|
||||||
if counts is not None:
|
if counts is not None:
|
||||||
cum_counts = list(_accumulate(counts))
|
cum_counts = list(_accumulate(counts))
|
||||||
|
|
|
@ -11,7 +11,7 @@ from functools import partial
|
||||||
from math import log, exp, pi, fsum, sin, factorial
|
from math import log, exp, pi, fsum, sin, factorial
|
||||||
from test import support
|
from test import support
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
from collections import Counter
|
from collections import abc, Counter
|
||||||
|
|
||||||
class TestBasicOps:
|
class TestBasicOps:
|
||||||
# Superclass with tests common to all generators.
|
# Superclass with tests common to all generators.
|
||||||
|
@ -163,6 +163,22 @@ class TestBasicOps:
|
||||||
population = {10, 20, 30, 40, 50, 60, 70}
|
population = {10, 20, 30, 40, 50, 60, 70}
|
||||||
self.gen.sample(population, k=5)
|
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):
|
def test_sample_with_counts(self):
|
||||||
sample = self.gen.sample
|
sample = self.gen.sample
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
:func:`random.sample` no longer warns on a sequence which is also a set.
|
Loading…
Reference in New Issue