bpo-42470: Do not warn on sequences which are also sets in random.sample() (GH-23665)

This commit is contained in:
masklinn 2020-12-19 05:33:36 +01:00 committed by GitHub
parent e009612476
commit 1e27b57dbc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 7 deletions

View File

@ -424,12 +424,13 @@ class Random(_random.Random):
# too many calls to _randbelow(), making them slower and
# causing them to eat more entropy than necessary.
if not isinstance(population, _Sequence):
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):
else:
raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).")
n = len(population)
if counts is not None:

View File

@ -11,7 +11,7 @@ from functools import partial
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.
@ -163,6 +163,22 @@ class TestBasicOps:
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

View File

@ -0,0 +1 @@
:func:`random.sample` no longer warns on a sequence which is also a set.