mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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` | ||||
|    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 | ||||
| ------------------------- | ||||
| 
 | ||||
|  |  | |||
|  | @ -367,9 +367,12 @@ def sample(self, population, k): | |||
|         # 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: | ||||
|  |  | |||
|  | @ -147,7 +147,6 @@ def test_sample_distribution(self): | |||
| 
 | ||||
|     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 @@ def test_sample_inputs(self): | |||
|     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'] | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| Deprecated support for set objects in random.sample(). | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Raymond Hettinger
						Raymond Hettinger