summaryrefslogtreecommitdiffstats
path: root/Lib/random.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2006-03-29 09:13:13 (GMT)
committerRaymond Hettinger <python@rcn.com>2006-03-29 09:13:13 (GMT)
commit3c3346daa9bf900080428ed12b6d83aa04f7332b (patch)
tree08c345b00a41ebb40ee9bf4ade8cc3833cc7ba57 /Lib/random.py
parent62e97f023bf0c02f5f3c1a1552e8136c0b5c4cff (diff)
downloadcpython-3c3346daa9bf900080428ed12b6d83aa04f7332b.zip
cpython-3c3346daa9bf900080428ed12b6d83aa04f7332b.tar.gz
cpython-3c3346daa9bf900080428ed12b6d83aa04f7332b.tar.bz2
SF bug #1460340: random.sample can raise KeyError
Fix the hit and miss style of testing for sets and dicts.
Diffstat (limited to 'Lib/random.py')
-rw-r--r--Lib/random.py21
1 files changed, 11 insertions, 10 deletions
diff --git a/Lib/random.py b/Lib/random.py
index b4ad2b3..943fa51 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -312,17 +312,18 @@ class Random(_random.Random):
pool[j] = pool[n-i-1] # move non-selected item into vacancy
else:
try:
- n > 0 and (population[0], population[n//2], population[n-1])
- except (TypeError, KeyError): # handle non-sequence iterables
- population = tuple(population)
- selected = set()
- selected_add = selected.add
- for i in xrange(k):
- j = _int(random() * n)
- while j in selected:
+ selected = set()
+ selected_add = selected.add
+ for i in xrange(k):
j = _int(random() * n)
- selected_add(j)
- result[i] = population[j]
+ while j in selected:
+ j = _int(random() * n)
+ selected_add(j)
+ result[i] = population[j]
+ except (TypeError, KeyError): # handle sets and dictionaries
+ if isinstance(population, list):
+ raise
+ return self.sample(list(population), k)
return result
## -------------------- real-valued distributions -------------------