From: Raymond Hettinger Date: Tue, 24 Feb 2009 11:31:49 +0000 (+0000) Subject: Backport r69934 and r69935: X-Git-Tag: 3.0~363 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=610132badae828f7e4cd7143a563f1b9cb680a35;p=thirdparty%2FPython%2Fcpython.git Backport r69934 and r69935: register range() as a sequence Use ABCs for input validation in random.sample() --- diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py index eed87628beb4..c7636ec80e6f 100644 --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -546,6 +546,7 @@ class Sequence(Sized, Iterable, Container): Sequence.register(tuple) Sequence.register(str) +Sequence.register(range) class ByteString(Sequence): diff --git a/Lib/random.py b/Lib/random.py index 70603ca2ae4e..9279d1d699a9 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -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: diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index d7780bbcadec..ce886521a639 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -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__')