mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Merged revisions 55007-55179 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk ........ r55077 | guido.van.rossum | 2007-05-02 11:54:37 -0700 (Wed, 02 May 2007) | 2 lines Use the new print syntax, at least. ........ r55142 | fred.drake | 2007-05-04 21:27:30 -0700 (Fri, 04 May 2007) | 1 line remove old cruftiness ........ r55143 | fred.drake | 2007-05-04 21:52:16 -0700 (Fri, 04 May 2007) | 1 line make this work with the new Python ........ r55162 | neal.norwitz | 2007-05-06 22:29:18 -0700 (Sun, 06 May 2007) | 1 line Get asdl code gen working with Python 2.3. Should continue to work with 3.0 ........ r55164 | neal.norwitz | 2007-05-07 00:00:38 -0700 (Mon, 07 May 2007) | 1 line Verify checkins to p3yk (sic) branch go to 3000 list. ........ r55166 | neal.norwitz | 2007-05-07 00:12:35 -0700 (Mon, 07 May 2007) | 1 line Fix this test so it runs again by importing warnings_test properly. ........ r55167 | neal.norwitz | 2007-05-07 01:03:22 -0700 (Mon, 07 May 2007) | 8 lines So long xrange. range() now supports values that are outside -sys.maxint to sys.maxint. floats raise a TypeError. This has been sitting for a long time. It probably has some problems and needs cleanup. Objects/rangeobject.c now uses 4-space indents since it is almost completely new. ........ r55171 | guido.van.rossum | 2007-05-07 10:21:26 -0700 (Mon, 07 May 2007) | 4 lines Fix two tests that were previously depending on significant spaces at the end of a line (and before that on Python 2.x print behavior that has no exact equivalent in 3.0). ........
This commit is contained in:
parent
598d98a7e8
commit
805365ee39
150 changed files with 1412 additions and 1320 deletions
|
|
@ -9,14 +9,14 @@ The desired invariant is: len(it)==len(list(it)).
|
|||
|
||||
A complication is that an iterable and iterator can be the same object. To
|
||||
maintain the invariant, an iterator needs to dynamically update its length.
|
||||
For instance, an iterable such as xrange(10) always reports its length as ten,
|
||||
but it=iter(xrange(10)) starts at ten, and then goes to nine after next(it).
|
||||
For instance, an iterable such as range(10) always reports its length as ten,
|
||||
but it=iter(range(10)) starts at ten, and then goes to nine after next(it).
|
||||
Having this capability means that map() can ignore the distinction between
|
||||
map(func, iterable) and map(func, iter(iterable)).
|
||||
|
||||
When the iterable is immutable, the implementation can straight-forwardly
|
||||
report the original length minus the cumulative number of calls to next().
|
||||
This is the case for tuples, xrange objects, and itertools.repeat().
|
||||
This is the case for tuples, range objects, and itertools.repeat().
|
||||
|
||||
Some containers become temporarily immutable during iteration. This includes
|
||||
dicts, sets, and collections.deque. Their implementation is equally simple
|
||||
|
|
@ -65,7 +65,7 @@ class TestInvariantWithoutMutations(unittest.TestCase):
|
|||
|
||||
def test_invariant(self):
|
||||
it = self.it
|
||||
for i in reversed(xrange(1, n+1)):
|
||||
for i in reversed(range(1, n+1)):
|
||||
self.assertEqual(len(it), i)
|
||||
next(it)
|
||||
self.assertEqual(len(it), 0)
|
||||
|
|
@ -100,59 +100,59 @@ class TestRepeat(TestInvariantWithoutMutations):
|
|||
class TestXrange(TestInvariantWithoutMutations):
|
||||
|
||||
def setUp(self):
|
||||
self.it = iter(xrange(n))
|
||||
self.it = iter(range(n))
|
||||
|
||||
class TestXrangeCustomReversed(TestInvariantWithoutMutations):
|
||||
|
||||
def setUp(self):
|
||||
self.it = reversed(xrange(n))
|
||||
self.it = reversed(range(n))
|
||||
|
||||
class TestTuple(TestInvariantWithoutMutations):
|
||||
|
||||
def setUp(self):
|
||||
self.it = iter(tuple(xrange(n)))
|
||||
self.it = iter(tuple(range(n)))
|
||||
|
||||
## ------- Types that should not be mutated during iteration -------
|
||||
|
||||
class TestDeque(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = deque(xrange(n))
|
||||
d = deque(range(n))
|
||||
self.it = iter(d)
|
||||
self.mutate = d.pop
|
||||
|
||||
class TestDequeReversed(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = deque(xrange(n))
|
||||
d = deque(range(n))
|
||||
self.it = reversed(d)
|
||||
self.mutate = d.pop
|
||||
|
||||
class TestDictKeys(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = dict.fromkeys(xrange(n))
|
||||
d = dict.fromkeys(range(n))
|
||||
self.it = iter(d)
|
||||
self.mutate = d.popitem
|
||||
|
||||
class TestDictItems(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = dict.fromkeys(xrange(n))
|
||||
d = dict.fromkeys(range(n))
|
||||
self.it = iter(d.items())
|
||||
self.mutate = d.popitem
|
||||
|
||||
class TestDictValues(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = dict.fromkeys(xrange(n))
|
||||
d = dict.fromkeys(range(n))
|
||||
self.it = iter(d.values())
|
||||
self.mutate = d.popitem
|
||||
|
||||
class TestSet(TestTemporarilyImmutable):
|
||||
|
||||
def setUp(self):
|
||||
d = set(xrange(n))
|
||||
d = set(range(n))
|
||||
self.it = iter(d)
|
||||
self.mutate = d.pop
|
||||
|
||||
|
|
@ -164,7 +164,7 @@ class TestList(TestInvariantWithoutMutations):
|
|||
self.it = iter(range(n))
|
||||
|
||||
def test_mutation(self):
|
||||
d = range(n)
|
||||
d = list(range(n))
|
||||
it = iter(d)
|
||||
next(it)
|
||||
next(it)
|
||||
|
|
@ -174,7 +174,7 @@ class TestList(TestInvariantWithoutMutations):
|
|||
d[1:] = []
|
||||
self.assertEqual(len(it), 0)
|
||||
self.assertEqual(list(it), [])
|
||||
d.extend(xrange(20))
|
||||
d.extend(range(20))
|
||||
self.assertEqual(len(it), 0)
|
||||
|
||||
class TestListReversed(TestInvariantWithoutMutations):
|
||||
|
|
@ -183,7 +183,7 @@ class TestListReversed(TestInvariantWithoutMutations):
|
|||
self.it = reversed(range(n))
|
||||
|
||||
def test_mutation(self):
|
||||
d = range(n)
|
||||
d = list(range(n))
|
||||
it = reversed(d)
|
||||
next(it)
|
||||
next(it)
|
||||
|
|
@ -193,7 +193,7 @@ class TestListReversed(TestInvariantWithoutMutations):
|
|||
d[1:] = []
|
||||
self.assertEqual(len(it), 0)
|
||||
self.assertEqual(list(it), []) # confirm invariant
|
||||
d.extend(xrange(20))
|
||||
d.extend(range(20))
|
||||
self.assertEqual(len(it), 0)
|
||||
|
||||
class TestSeqIter(TestInvariantWithoutMutations):
|
||||
|
|
@ -212,7 +212,7 @@ class TestSeqIter(TestInvariantWithoutMutations):
|
|||
d[1:] = []
|
||||
self.assertEqual(len(it), 0)
|
||||
self.assertEqual(list(it), [])
|
||||
d.extend(xrange(20))
|
||||
d.extend(range(20))
|
||||
self.assertEqual(len(it), 0)
|
||||
|
||||
class TestSeqIterReversed(TestInvariantWithoutMutations):
|
||||
|
|
@ -231,7 +231,7 @@ class TestSeqIterReversed(TestInvariantWithoutMutations):
|
|||
d[1:] = []
|
||||
self.assertEqual(len(it), 0)
|
||||
self.assertEqual(list(it), []) # confirm invariant
|
||||
d.extend(xrange(20))
|
||||
d.extend(range(20))
|
||||
self.assertEqual(len(it), 0)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue