]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport r69934 and r69935:
authorRaymond Hettinger <python@rcn.com>
Tue, 24 Feb 2009 11:31:49 +0000 (11:31 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 24 Feb 2009 11:31:49 +0000 (11:31 +0000)
 register range() as a sequence
 Use ABCs for input validation in random.sample()

Lib/_abcoll.py
Lib/random.py
Lib/test/test_collections.py

index eed87628beb46d6e6cae734cb0afdbbda94e3134..c7636ec80e6f5e0a863f6facbe4b0d78d24e751c 100644 (file)
@@ -546,6 +546,7 @@ class Sequence(Sized, Iterable, Container):
 
 Sequence.register(tuple)
 Sequence.register(str)
+Sequence.register(range)
 
 
 class ByteString(Sequence):
index 70603ca2ae4ee1584bbaaccd845e68b4b128700c..9279d1d699a983875d9a8bf18085f6544d44a682 100644 (file)
@@ -43,6 +43,7 @@ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
 from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
 from os import urandom as _urandom
 from binascii import hexlify as _hexlify
+import collections as _collections
 
 __all__ = ["Random","seed","random","uniform","randint","choice","sample",
            "randrange","shuffle","normalvariate","lognormvariate",
@@ -296,10 +297,10 @@ class Random(_random.Random):
         # preferred since the list takes less space than the
         # set and it doesn't suffer from frequent reselections.
 
-        if isinstance(population, (set, frozenset)):
+        if isinstance(population, _collections.Set):
             population = tuple(population)
-        if not hasattr(population, '__getitem__') or hasattr(population, 'keys'):
-            raise TypeError("Population must be a sequence or set.  For dicts, use dict.keys().")
+        if not isinstance(population, _collections.Sequence):
+            raise TypeError("Population must be a sequence or Set.  For dicts, use list(d).")
         random = self.random
         n = len(population)
         if not 0 <= k <= n:
index d7780bbcadec64f3c5492f892bb216a3944d82ce..ce886521a6393c839d79a292ad6555654654c083 100644 (file)
@@ -393,6 +393,8 @@ class TestCollectionABCs(ABCTestCase):
         for sample in [tuple, list, bytes, str]:
             self.failUnless(isinstance(sample(), Sequence))
             self.failUnless(issubclass(sample, Sequence))
+        self.failUnless(isinstance(range(10), Sequence))
+        self.failUnless(issubclass(range, Sequence))
         self.failUnless(issubclass(str, Sequence))
         self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__',
             '__getitem__')