blob: 70517f06700705dec9e4acc637ede768bc675cbf [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from itertools import *
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02004import weakref
Raymond Hettinger8a882a72009-02-12 12:08:18 +00005from decimal import Decimal
Raymond Hettingerde09acf2009-02-12 12:53:53 +00006from fractions import Fraction
Raymond Hettinger2012f172003-02-07 05:32:58 +00007import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00009import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +000010import copy
11import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000012from functools import reduce
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +020013import sys
14import struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +000015maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000016minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000017
Guido van Rossum801f0d72006-08-24 19:48:10 +000018def lzip(*args):
19 return list(zip(*args))
20
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000021def onearg(x):
22 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000023 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000024
25def errfunc(*args):
26 'Test function that raises an error'
27 raise ValueError
28
29def gen3():
30 'Non-restartable source sequence'
31 for i in (0, 1, 2):
32 yield i
33
34def isEven(x):
35 'Test predicate'
36 return x%2==0
37
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000038def isOdd(x):
39 'Test predicate'
40 return x%2==1
41
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000042def tupleize(*args):
43 return args
44
45def irange(n):
46 for i in range(n):
47 yield i
48
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049class StopNow:
50 'Class emulating an empty iterable.'
51 def __iter__(self):
52 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000053 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055
Raymond Hettinger02420702003-06-29 20:36:23 +000056def take(n, seq):
57 'Convenience function for partially consuming a long of infinite iterable'
58 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000059
Christian Heimes78644762008-03-04 23:39:23 +000060def prod(iterable):
61 return reduce(operator.mul, iterable, 1)
62
Christian Heimes380f7f22008-02-28 11:19:05 +000063def fact(n):
64 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000065 return prod(range(1, n+1))
66
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000067# root level methods for pickling ability
68def testR(r):
69 return r[0]
70
71def testR2(r):
72 return r[2]
73
74def underten(x):
75 return x<10
76
Raymond Hettinger96ef8112003-02-01 00:10:11 +000077class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000078
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000079 def pickletest(self, it, stop=4, take=1, compare=None):
80 """Test that an iterator is the same after pickling, also when part-consumed"""
81 def expand(it, i=0):
82 # Recursively expand iterables, within sensible bounds
83 if i > 10:
84 raise RuntimeError("infinite recursion encountered")
85 if isinstance(it, str):
86 return it
87 try:
88 l = list(islice(it, stop))
89 except TypeError:
90 return it # can't expand it
91 return [expand(e, i+1) for e in l]
92
93 # Test the initial copy against the original
94 dump = pickle.dumps(it)
95 i2 = pickle.loads(dump)
96 self.assertEqual(type(it), type(i2))
97 a, b = expand(it), expand(i2)
98 self.assertEqual(a, b)
99 if compare:
100 c = expand(compare)
101 self.assertEqual(a, c)
102
103 # Take from the copy, and create another copy and compare them.
104 i3 = pickle.loads(dump)
105 took = 0
106 try:
107 for i in range(take):
108 next(i3)
109 took += 1
110 except StopIteration:
111 pass #in case there is less data than 'take'
112 dump = pickle.dumps(i3)
113 i4 = pickle.loads(dump)
114 a, b = expand(i3), expand(i4)
115 self.assertEqual(a, b)
116 if compare:
117 c = expand(compare[took:])
118 self.assertEqual(a, c);
119
Raymond Hettinger482ba772010-12-01 22:48:00 +0000120 def test_accumulate(self):
121 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000122 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
123 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
124 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000125 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000126 self.assertEqual(
127 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000128 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000129 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000130 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000131 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700132 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000133 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000134 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000135 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
136
Raymond Hettinger5d446132011-03-27 18:52:10 -0700137 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
138 self.assertEqual(list(accumulate(s, min)),
139 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
140 self.assertEqual(list(accumulate(s, max)),
141 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
142 self.assertEqual(list(accumulate(s, operator.mul)),
143 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
144 with self.assertRaises(TypeError):
145 list(accumulate(s, chr)) # unary-operation
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000146 self.pickletest(accumulate(range(10))) # test pickling
Raymond Hettinger5d446132011-03-27 18:52:10 -0700147
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000148 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000149
150 def chain2(*iterables):
151 'Pure python version in the docs'
152 for it in iterables:
153 for element in it:
154 yield element
155
156 for c in (chain, chain2):
157 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
158 self.assertEqual(list(c('abc')), list('abc'))
159 self.assertEqual(list(c('')), [])
160 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
161 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000162
163 def test_chain_from_iterable(self):
164 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
165 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
166 self.assertEqual(list(chain.from_iterable([''])), [])
167 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
168 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000169
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000170 def test_chain_reducible(self):
171 operators = [copy.deepcopy,
172 lambda s: pickle.loads(pickle.dumps(s))]
173 for oper in operators:
174 it = chain('abc', 'def')
175 self.assertEqual(list(oper(it)), list('abcdef'))
176 self.assertEqual(next(it), 'a')
177 self.assertEqual(list(oper(it)), list('bcdef'))
178
179 self.assertEqual(list(oper(chain(''))), [])
180 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
181 self.assertRaises(TypeError, list, oper(chain(2, 3)))
182 self.pickletest(chain('abc', 'def'), compare=list('abcdef'))
183
Christian Heimes380f7f22008-02-28 11:19:05 +0000184 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000185 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000186 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000187 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000188 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000189
190 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
191 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
192
193 self.assertEqual(list(op(combinations('ABCD', 2))),
194 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
195 testIntermediate = combinations('ABCD', 2)
196 next(testIntermediate)
197 self.assertEqual(list(op(testIntermediate)),
198 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
199
200 self.assertEqual(list(op(combinations(range(4), 3))),
201 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
202 testIntermediate = combinations(range(4), 3)
203 next(testIntermediate)
204 self.assertEqual(list(op(testIntermediate)),
205 [(0,1,3), (0,2,3), (1,2,3)])
206
Christian Heimes78644762008-03-04 23:39:23 +0000207
208 def combinations1(iterable, r):
209 'Pure python version shown in the docs'
210 pool = tuple(iterable)
211 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000212 if r > n:
213 return
Christian Heimes78644762008-03-04 23:39:23 +0000214 indices = list(range(r))
215 yield tuple(pool[i] for i in indices)
216 while 1:
217 for i in reversed(range(r)):
218 if indices[i] != i + n - r:
219 break
220 else:
221 return
222 indices[i] += 1
223 for j in range(i+1, r):
224 indices[j] = indices[j-1] + 1
225 yield tuple(pool[i] for i in indices)
226
227 def combinations2(iterable, r):
228 'Pure python version shown in the docs'
229 pool = tuple(iterable)
230 n = len(pool)
231 for indices in permutations(range(n), r):
232 if sorted(indices) == list(indices):
233 yield tuple(pool[i] for i in indices)
234
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000235 def combinations3(iterable, r):
236 'Pure python version from cwr()'
237 pool = tuple(iterable)
238 n = len(pool)
239 for indices in combinations_with_replacement(range(n), r):
240 if len(set(indices)) == r:
241 yield tuple(pool[i] for i in indices)
242
Christian Heimes78644762008-03-04 23:39:23 +0000243 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000244 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000245 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000246 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000247 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs
Christian Heimes380f7f22008-02-28 11:19:05 +0000248 self.assertEqual(len(result), len(set(result))) # no repeats
249 self.assertEqual(result, sorted(result)) # lexicographic order
250 for c in result:
251 self.assertEqual(len(c), r) # r-length combinations
252 self.assertEqual(len(set(c)), r) # no duplicate elements
253 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000254 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000255 self.assertEqual(list(c),
256 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000257 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000258 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000259 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000260
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000261 self.pickletest(combinations(values, r)) # test pickling
262
263 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700264 @support.impl_detail("tuple reuse is specific to CPython")
265 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000266 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
267 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
268
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000269 def test_combinations_with_replacement(self):
270 cwr = combinations_with_replacement
271 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
272 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
273 self.assertRaises(TypeError, cwr, None) # pool is not iterable
274 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000275
276 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
277 self.assertEqual(list(op(cwr('ABC', 2))),
278 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
279 testIntermediate = cwr('ABC', 2)
280 next(testIntermediate)
281 self.assertEqual(list(op(testIntermediate)),
282 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
283
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000284
285 def cwr1(iterable, r):
286 'Pure python version shown in the docs'
287 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
288 pool = tuple(iterable)
289 n = len(pool)
290 if not n and r:
291 return
292 indices = [0] * r
293 yield tuple(pool[i] for i in indices)
294 while 1:
295 for i in reversed(range(r)):
296 if indices[i] != n - 1:
297 break
298 else:
299 return
300 indices[i:] = [indices[i] + 1] * (r - i)
301 yield tuple(pool[i] for i in indices)
302
303 def cwr2(iterable, r):
304 'Pure python version shown in the docs'
305 pool = tuple(iterable)
306 n = len(pool)
307 for indices in product(range(n), repeat=r):
308 if sorted(indices) == list(indices):
309 yield tuple(pool[i] for i in indices)
310
311 def numcombs(n, r):
312 if not n:
313 return 0 if r else 1
314 return fact(n+r-1) / fact(r)/ fact(n-1)
315
316 for n in range(7):
317 values = [5*x-12 for x in range(n)]
318 for r in range(n+2):
319 result = list(cwr(values, r))
320
321 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
322 self.assertEqual(len(result), len(set(result))) # no repeats
323 self.assertEqual(result, sorted(result)) # lexicographic order
324
325 regular_combs = list(combinations(values, r)) # compare to combs without replacement
326 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000327 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000328 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000329 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000330
331 for c in result:
332 self.assertEqual(len(c), r) # r-length combinations
333 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
334 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
335 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000336 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000337 self.assertEqual(noruns,
338 [e for e in values if e in c]) # comb is a subsequence of the input iterable
339 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
340 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
341
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000342 self.pickletest(cwr(values,r)) # test pickling
343
344 # Test implementation detail: tuple re-use
345
Alex Gaynore151d212011-07-17 16:21:30 -0700346 @support.impl_detail("tuple reuse is specific to CPython")
347 def test_combinations_with_replacement_tuple_reuse(self):
348 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000349 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
350 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
351
Christian Heimes78644762008-03-04 23:39:23 +0000352 def test_permutations(self):
353 self.assertRaises(TypeError, permutations) # too few arguments
354 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000355 self.assertRaises(TypeError, permutations, None) # pool is not iterable
356 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000357 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000358 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000359 self.assertEqual(list(permutations(range(3), 2)),
360 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
361
362 def permutations1(iterable, r=None):
363 'Pure python version shown in the docs'
364 pool = tuple(iterable)
365 n = len(pool)
366 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000367 if r > n:
368 return
Christian Heimes78644762008-03-04 23:39:23 +0000369 indices = list(range(n))
370 cycles = list(range(n-r+1, n+1))[::-1]
371 yield tuple(pool[i] for i in indices[:r])
372 while n:
373 for i in reversed(range(r)):
374 cycles[i] -= 1
375 if cycles[i] == 0:
376 indices[i:] = indices[i+1:] + indices[i:i+1]
377 cycles[i] = n - i
378 else:
379 j = cycles[i]
380 indices[i], indices[-j] = indices[-j], indices[i]
381 yield tuple(pool[i] for i in indices[:r])
382 break
383 else:
384 return
385
386 def permutations2(iterable, r=None):
387 'Pure python version shown in the docs'
388 pool = tuple(iterable)
389 n = len(pool)
390 r = n if r is None else r
391 for indices in product(range(n), repeat=r):
392 if len(set(indices)) == r:
393 yield tuple(pool[i] for i in indices)
394
395 for n in range(7):
396 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000397 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000398 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000399 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms
Christian Heimes78644762008-03-04 23:39:23 +0000400 self.assertEqual(len(result), len(set(result))) # no repeats
401 self.assertEqual(result, sorted(result)) # lexicographic order
402 for p in result:
403 self.assertEqual(len(p), r) # r-length permutations
404 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000405 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000406 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000407 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000408 if r == n:
409 self.assertEqual(result, list(permutations(values, None))) # test r as None
410 self.assertEqual(result, list(permutations(values))) # test default r
411
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000412 self.pickletest(permutations(values, r)) # test pickling
413
Zachary Waredca807b2014-04-24 13:22:05 -0500414 @support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynore151d212011-07-17 16:21:30 -0700415 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000416 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000417 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000418
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000419 def test_combinatorics(self):
420 # Test relationships between product(), permutations(),
421 # combinations() and combinations_with_replacement().
422
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000423 for n in range(6):
424 s = 'ABCDEFG'[:n]
425 for r in range(8):
426 prod = list(product(s, repeat=r))
427 cwr = list(combinations_with_replacement(s, r))
428 perm = list(permutations(s, r))
429 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000430
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000431 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000432 self.assertEqual(len(prod), n**r)
433 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
434 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
435 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000436
437 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000438 self.assertEqual(prod, sorted(set(prod)))
439 self.assertEqual(cwr, sorted(set(cwr)))
440 self.assertEqual(perm, sorted(set(perm)))
441 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000442
443 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000444 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
445 self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000446 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
447 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
448 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
449 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
450 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000451
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000452 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000453 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000454 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
455 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
456 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
457 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
458 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
459 n = 10000
460 data = chain.from_iterable(repeat(range(6), n))
461 selectors = chain.from_iterable(repeat((0, 1)))
462 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
463 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
464 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
465 self.assertRaises(TypeError, compress, range(6)) # too few args
466 self.assertRaises(TypeError, compress, range(6), None) # too many args
467
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000468 # check copy, deepcopy, pickle
469 for op in (lambda a:copy.copy(a), lambda a:copy.deepcopy(a), lambda a:pickle.loads(pickle.dumps(a))):
470 for data, selectors, result1, result2 in [
471 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
472 ('ABCDEF', [0,0,0,0,0,0], '', ''),
473 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
474 ('ABCDEF', [1,0,1], 'AC', 'C'),
475 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
476 ]:
477
478 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
479 self.assertEqual(list(op(compress(data, selectors))), list(result1))
480 testIntermediate = compress(data, selectors)
481 if result1:
482 next(testIntermediate)
483 self.assertEqual(list(op(testIntermediate)), list(result2))
484
485
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000486 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000487 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
488 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
489 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000490 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
491 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000492 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000493 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000494 self.assertEqual(list(islice(count(maxsize-5), 10)),
495 list(range(maxsize-5, maxsize+5)))
496 self.assertEqual(list(islice(count(-maxsize-5), 10)),
497 list(range(-maxsize-5, -maxsize+5)))
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000498 self.assertEqual(list(islice(count(10, maxsize+5), 3)),
499 list(range(10, 10+3*(maxsize+5), maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000500 c = count(3)
501 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000502 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000503 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504 c = count(-9)
505 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000506 next(c)
Raymond Hettinger30729212009-02-12 06:28:27 +0000507 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000508 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000509 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300510 # Test repr
511 r1 = repr(count(i))
512 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000513 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000514
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000515 # check copy, deepcopy, pickle
516 for value in -3, 3, maxsize-5, maxsize+5:
517 c = count(value)
518 self.assertEqual(next(copy.copy(c)), value)
519 self.assertEqual(next(copy.deepcopy(c)), value)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000520 self.pickletest(count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000521
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000522 #check proper internal error handling for large "step' sizes
523 count(1, maxsize+5); sys.exc_info()
524
Raymond Hettinger30729212009-02-12 06:28:27 +0000525 def test_count_with_stride(self):
526 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000527 self.assertEqual(lzip('abc',count(start=2,step=3)),
528 [('a', 2), ('b', 5), ('c', 8)])
529 self.assertEqual(lzip('abc',count(step=-1)),
530 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000531 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
532 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000533 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000534 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
535 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
536 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000537 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
538 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000539 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
540 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000541 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
542 c = count(3, 5)
543 self.assertEqual(repr(c), 'count(3, 5)')
544 next(c)
545 self.assertEqual(repr(c), 'count(8, 5)')
546 c = count(-9, 0)
547 self.assertEqual(repr(c), 'count(-9, 0)')
548 next(c)
549 self.assertEqual(repr(c), 'count(-9, 0)')
550 c = count(-9, -3)
551 self.assertEqual(repr(c), 'count(-9, -3)')
552 next(c)
553 self.assertEqual(repr(c), 'count(-12, -3)')
554 self.assertEqual(repr(c), 'count(-12, -3)')
555 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
556 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
557 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
558 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
559 for j in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 1, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300560 # Test repr
561 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000562 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300563 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000564 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300565 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000566 self.assertEqual(r1, r2)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000567 self.pickletest(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000568
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000569 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000570 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000571 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000572 self.assertRaises(TypeError, cycle)
573 self.assertRaises(TypeError, cycle, 5)
574 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000575
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000576 # check copy, deepcopy, pickle
577 c = cycle('abc')
578 self.assertEqual(next(c), 'a')
579 #simple copy currently not supported, because __reduce__ returns
580 #an internal iterator
581 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
582 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
583 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('bcabcabcab'))
584 next(c)
585 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('cabcabcabc'))
586 self.pickletest(cycle('abc'))
587
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000588 def test_groupby(self):
589 # Check whether it accepts arguments correctly
590 self.assertEqual([], list(groupby([])))
591 self.assertEqual([], list(groupby([], key=id)))
592 self.assertRaises(TypeError, list, groupby('abc', []))
593 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000594 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000595
596 # Check normal input
597 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
598 (2,15,22), (3,16,23), (3,17,23)]
599 dup = []
600 for k, g in groupby(s, lambda r:r[0]):
601 for elem in g:
602 self.assertEqual(k, elem[0])
603 dup.append(elem)
604 self.assertEqual(s, dup)
605
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000606 # Check normal pickled
607 dup = []
608 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
609 for elem in g:
610 self.assertEqual(k, elem[0])
611 dup.append(elem)
612 self.assertEqual(s, dup)
613
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000614 # Check nested case
615 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000616 for k, g in groupby(s, testR):
617 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000618 for elem in ig:
619 self.assertEqual(k, elem[0])
620 self.assertEqual(ik, elem[2])
621 dup.append(elem)
622 self.assertEqual(s, dup)
623
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000624 # Check nested and pickled
625 dup = []
626 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
627 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2))):
628 for elem in ig:
629 self.assertEqual(k, elem[0])
630 self.assertEqual(ik, elem[2])
631 dup.append(elem)
632 self.assertEqual(s, dup)
633
634
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000635 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000636 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000637 expectedkeys = set([r[0] for r in s])
638 self.assertEqual(set(keys), expectedkeys)
639 self.assertEqual(len(keys), len(expectedkeys))
640
641 # Exercise pipes and filters style
642 s = 'abracadabra'
643 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000644 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000645 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
646 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000647 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000648 self.assertEqual(r, ['a', 'b', 'r'])
649 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000650 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000651 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
652 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000653 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000654 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
655
Georg Brandla18af4e2007-04-21 15:47:16 +0000656 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000657 class ExpectedError(Exception):
658 pass
659 def delayed_raise(n=0):
660 for i in range(n):
661 yield 'yo'
662 raise ExpectedError
663 def gulp(iterable, keyp=None, func=list):
664 return [func(g) for k, g in groupby(iterable, keyp)]
665
Georg Brandla18af4e2007-04-21 15:47:16 +0000666 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000667 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000668 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000669 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
670
671 # __cmp__ failure
672 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000673 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000674 raise ExpectedError
675 s = [DummyCmp(), DummyCmp(), None]
676
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000677 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000678 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000679 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000680 self.assertRaises(ExpectedError, gulp, s)
681
682 # keyfunc failure
683 def keyfunc(obj):
684 if keyfunc.skip > 0:
685 keyfunc.skip -= 1
686 return obj
687 else:
688 raise ExpectedError
689
690 # keyfunc failure on outer object
691 keyfunc.skip = 0
692 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
693 keyfunc.skip = 1
694 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
695
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000696 def test_filter(self):
697 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
698 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
699 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
700 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
701 self.assertRaises(TypeError, filter)
702 self.assertRaises(TypeError, filter, lambda x:x)
703 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
704 self.assertRaises(TypeError, filter, isEven, 3)
705 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000706
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000707 # check copy, deepcopy, pickle
708 ans = [0,2,4]
709
710 c = filter(isEven, range(6))
711 self.assertEqual(list(copy.copy(c)), ans)
712 c = filter(isEven, range(6))
713 self.assertEqual(list(copy.deepcopy(c)), ans)
714 c = filter(isEven, range(6))
715 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans)
716 next(c)
717 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans[1:])
718 c = filter(isEven, range(6))
719 self.pickletest(c)
720
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000721 def test_filterfalse(self):
722 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
723 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
724 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
725 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
726 self.assertRaises(TypeError, filterfalse)
727 self.assertRaises(TypeError, filterfalse, lambda x:x)
728 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
729 self.assertRaises(TypeError, filterfalse, isEven, 3)
730 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000731 self.pickletest(filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000732
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000733 def test_zip(self):
734 # XXX This is rather silly now that builtin zip() calls zip()...
735 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000736 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000737 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
738 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
739 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
740 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
741 self.assertEqual(list(zip()), lzip())
742 self.assertRaises(TypeError, zip, 3)
743 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000744 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000745 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000746 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000747 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700748
749 @support.impl_detail("tuple reuse is specific to CPython")
750 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000751 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000752 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000753 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000754 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000755
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000756 # check copy, deepcopy, pickle
757 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
758 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
759
760 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
761 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
762
763 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count())))]
764 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
765
766 testIntermediate = zip('abc',count())
767 next(testIntermediate)
768 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate))]
769 self.assertEqual(ans, [('b', 1), ('c', 2)])
770
771 self.pickletest(zip('abc', count()))
772
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000773 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000774 for args in [
775 ['abc', range(6)],
776 [range(6), 'abc'],
777 [range(1000), range(2000,2100), range(3000,3050)],
778 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
779 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
780 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000781 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
782 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000783 self.assertEqual(list(zip_longest(*args)), target)
784 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000785 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000786 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000787
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000788 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000789
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000790 self.assertEqual(list(zip_longest()), list(zip()))
791 self.assertEqual(list(zip_longest([])), list(zip([])))
792 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000793
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000794 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000795 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000796 self.assertRaises(TypeError, zip_longest, 3)
797 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000798
799 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000800 "zip_longest('abc', fv=1)",
801 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000802 ]:
803 try:
804 eval(stmt, globals(), locals())
805 except TypeError:
806 pass
807 else:
808 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000809
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000810 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000811 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000812 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000813 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700814
815 @support.impl_detail("tuple reuse is specific to CPython")
816 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000817 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000818 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000819 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000820 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
821
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000822 def test_zip_longest_pickling(self):
823 self.pickletest(zip_longest("abc", "def"))
824 self.pickletest(zip_longest("abc", "defgh"))
825 self.pickletest(zip_longest("abc", "defgh", fillvalue=1))
826 self.pickletest(zip_longest("", "defgh"))
827
Raymond Hettingerfc438512009-11-01 20:55:33 +0000828 def test_bug_7244(self):
829
830 class Repeater:
831 # this class is similar to itertools.repeat
832 def __init__(self, o, t, e):
833 self.o = o
834 self.t = int(t)
835 self.e = e
836 def __iter__(self): # its iterator is itself
837 return self
838 def __next__(self):
839 if self.t > 0:
840 self.t -= 1
841 return self.o
842 else:
843 raise self.e
844
845 # Formerly this code in would fail in debug mode
846 # with Undetected Error and Stop Iteration
847 r1 = Repeater(1, 3, StopIteration)
848 r2 = Repeater(2, 4, StopIteration)
849 def run(r1, r2):
850 result = []
851 for i, j in zip_longest(r1, r2, fillvalue=0):
852 with support.captured_output('stdout'):
853 print((i, j))
854 result.append((i, j))
855 return result
856 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
857
858 # Formerly, the RuntimeError would be lost
859 # and StopIteration would stop as expected
860 r1 = Repeater(1, 3, RuntimeError)
861 r2 = Repeater(2, 4, StopIteration)
862 it = zip_longest(r1, r2, fillvalue=0)
863 self.assertEqual(next(it), (1, 2))
864 self.assertEqual(next(it), (1, 2))
865 self.assertEqual(next(it), (1, 2))
866 self.assertRaises(RuntimeError, next, it)
867
Christian Heimesc3f30c42008-02-22 16:37:40 +0000868 def test_product(self):
869 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000870 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000871 (['ab'], [('a',), ('b',)]), # one iterable
872 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
873 ([range(0), range(2), range(3)], []), # first iterable with zero length
874 ([range(2), range(0), range(3)], []), # middle iterable with zero length
875 ([range(2), range(3), range(0)], []), # last iterable with zero length
876 ]:
877 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000878 for r in range(4):
879 self.assertEqual(list(product(*(args*r))),
880 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000881 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
882 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000883
884 def product1(*args, **kwds):
885 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
886 n = len(pools)
887 if n == 0:
888 yield ()
889 return
890 if any(len(pool) == 0 for pool in pools):
891 return
892 indices = [0] * n
893 yield tuple(pool[i] for pool, i in zip(pools, indices))
894 while 1:
895 for i in reversed(range(n)): # right to left
896 if indices[i] == len(pools[i]) - 1:
897 continue
898 indices[i] += 1
899 for j in range(i+1, n):
900 indices[j] = 0
901 yield tuple(pool[i] for pool, i in zip(pools, indices))
902 break
903 else:
904 return
905
906 def product2(*args, **kwds):
907 'Pure python version used in docs'
908 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
909 result = [[]]
910 for pool in pools:
911 result = [x+[y] for x in result for y in pool]
912 for prod in result:
913 yield tuple(prod)
914
Christian Heimesc3f30c42008-02-22 16:37:40 +0000915 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
916 set('abcdefg'), range(11), tuple(range(13))]
917 for i in range(100):
918 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000919 expected_len = prod(map(len, args))
920 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000921 self.assertEqual(list(product(*args)), list(product1(*args)))
922 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000923 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000924 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000925
Alex Gaynore151d212011-07-17 16:21:30 -0700926 @support.impl_detail("tuple reuse is specific to CPython")
927 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000928 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
929 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000930
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000931 def test_product_pickling(self):
932 # check copy, deepcopy, pickle
933 for args, result in [
934 ([], [()]), # zero iterables
935 (['ab'], [('a',), ('b',)]), # one iterable
936 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
937 ([range(0), range(2), range(3)], []), # first iterable with zero length
938 ([range(2), range(0), range(3)], []), # middle iterable with zero length
939 ([range(2), range(3), range(0)], []), # last iterable with zero length
940 ]:
941 self.assertEqual(list(copy.copy(product(*args))), result)
942 self.assertEqual(list(copy.deepcopy(product(*args))), result)
943 self.pickletest(product(*args))
944
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000945 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +0000946 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +0000947 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000948 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000949 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000950 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000951 self.assertEqual(list(repeat('a', 0)), [])
952 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000953 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000954 self.assertRaises(TypeError, repeat, None, 3, 4)
955 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000956 r = repeat(1+0j)
957 self.assertEqual(repr(r), 'repeat((1+0j))')
958 r = repeat(1+0j, 5)
959 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
960 list(r)
961 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000962
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000963 # check copy, deepcopy, pickle
964 c = repeat(object='a', times=10)
965 self.assertEqual(next(c), 'a')
966 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
967 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
968 self.pickletest(repeat(object='a', times=10))
969
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000970 def test_map(self):
971 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000972 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000973 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000974 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000975 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000976 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000977 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000978 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000979 self.assertEqual(list(map(operator.pow, [])), [])
980 self.assertRaises(TypeError, map)
981 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
982 self.assertRaises(TypeError, map, operator.neg)
983 self.assertRaises(TypeError, next, map(10, range(5)))
984 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
985 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000986
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000987 # check copy, deepcopy, pickle
988 ans = [('a',0),('b',1),('c',2)]
989
990 c = map(tupleize, 'abc', count())
991 self.assertEqual(list(copy.copy(c)), ans)
992
993 c = map(tupleize, 'abc', count())
994 self.assertEqual(list(copy.deepcopy(c)), ans)
995
996 c = map(tupleize, 'abc', count())
997 self.pickletest(c)
998
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000999 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001000 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1001 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001002 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001003 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001004 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001005 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1006 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001007 self.assertRaises(TypeError, starmap)
1008 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001009 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1010 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1011 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001012
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001013 # check copy, deepcopy, pickle
1014 ans = [0**1, 1**2, 2**3]
1015
1016 c = starmap(operator.pow, zip(range(3), range(1,7)))
1017 self.assertEqual(list(copy.copy(c)), ans)
1018
1019 c = starmap(operator.pow, zip(range(3), range(1,7)))
1020 self.assertEqual(list(copy.deepcopy(c)), ans)
1021
1022 c = starmap(operator.pow, zip(range(3), range(1,7)))
1023 self.pickletest(c)
1024
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001025 def test_islice(self):
1026 for args in [ # islice(args) should agree with range(args)
1027 (10, 20, 3),
1028 (10, 3, 20),
1029 (10, 20),
1030 (10, 3),
1031 (20,)
1032 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001033 self.assertEqual(list(islice(range(100), *args)),
1034 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001035
1036 for args, tgtargs in [ # Stop when seqn is exhausted
1037 ((10, 110, 3), ((10, 100, 3))),
1038 ((10, 110), ((10, 100))),
1039 ((110,), (100,))
1040 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001041 self.assertEqual(list(islice(range(100), *args)),
1042 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001043
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001044 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001045 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1046 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1047 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1048 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1049 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001050
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001051 # Test number of items consumed SF #1171417
1052 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001053 self.assertEqual(list(islice(it, 3)), list(range(3)))
1054 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001055
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001056 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001057 ra = range(10)
1058 self.assertRaises(TypeError, islice, ra)
1059 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1060 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1061 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1062 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1063 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1064 self.assertRaises(ValueError, islice, ra, 'a')
1065 self.assertRaises(ValueError, islice, ra, 'a', 1)
1066 self.assertRaises(ValueError, islice, ra, 1, 'a')
1067 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1068 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001069 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001070
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001071 # Issue #10323: Less islice in a predictable state
1072 c = count()
1073 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1074 self.assertEqual(next(c), 3)
1075
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001076 # check copy, deepcopy, pickle
1077 for args in [ # islice(args) should agree with range(args)
1078 (10, 20, 3),
1079 (10, 3, 20),
1080 (10, 20),
1081 (10, 3),
1082 (20,)
1083 ]:
1084 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1085 list(range(*args)))
1086 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1087 list(range(*args)))
1088 self.pickletest(islice(range(100), *args))
1089
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001090 # Issue #21321: check source iterator is not referenced
1091 # from islice() after the latter has been exhausted
1092 it = (x for x in (1, 2))
1093 wr = weakref.ref(it)
1094 it = islice(it, 1)
1095 self.assertIsNotNone(wr())
1096 list(it) # exhaust the iterator
1097 self.assertIsNone(wr())
1098
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001099 def test_takewhile(self):
1100 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001101 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001102 self.assertEqual(list(takewhile(underten, [])), [])
1103 self.assertRaises(TypeError, takewhile)
1104 self.assertRaises(TypeError, takewhile, operator.pow)
1105 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001106 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1107 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001108 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1109 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001110 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001111
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001112 # check copy, deepcopy, pickle
1113 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1114 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1115 [1, 3, 5])
1116 self.pickletest(takewhile(underten, data))
1117
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001118 def test_dropwhile(self):
1119 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001120 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001121 self.assertEqual(list(dropwhile(underten, [])), [])
1122 self.assertRaises(TypeError, dropwhile)
1123 self.assertRaises(TypeError, dropwhile, operator.pow)
1124 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001125 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1126 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001127
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001128 # check copy, deepcopy, pickle
1129 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1130 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1131 [20, 2, 4, 6, 8])
1132 self.pickletest(dropwhile(underten, data))
1133
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001134 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001135 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001136
1137 a, b = tee([]) # test empty iterator
1138 self.assertEqual(list(a), [])
1139 self.assertEqual(list(b), [])
1140
1141 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001142 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001143
1144 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001145 self.assertEqual(list(a), list(range(n)))
1146 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001147
1148 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001149 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001150 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001151 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001152 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001153
1154 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001155 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001156 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001157 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001158 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001159
Guido van Rossum805365e2007-05-07 22:24:25 +00001160 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001161 order = [0]*n + [1]*n
1162 random.shuffle(order)
1163 lists = ([], [])
1164 its = tee(irange(n))
1165 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001166 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001167 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001168 self.assertEqual(lists[0], list(range(n)))
1169 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001170
Raymond Hettingerad983e72003-11-12 14:32:26 +00001171 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001172 self.assertRaises(TypeError, tee)
1173 self.assertRaises(TypeError, tee, 3)
1174 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001175 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001176
Raymond Hettingerad983e72003-11-12 14:32:26 +00001177 # tee object should be instantiable
1178 a, b = tee('abc')
1179 c = type(a)('def')
1180 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001181
Raymond Hettingerad983e72003-11-12 14:32:26 +00001182 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001183 a, b, c = tee(range(2000), 3)
1184 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001185 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001186 self.assertEqual(list(b), list(range(2000)))
1187 self.assertEqual([next(c), next(c)], list(range(2)))
1188 self.assertEqual(list(a), list(range(100,2000)))
1189 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001190
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001191 # test values of n
1192 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001193 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001194 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001195 result = tee('abc', n)
1196 self.assertEqual(type(result), tuple)
1197 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001198 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001199
Raymond Hettingerad983e72003-11-12 14:32:26 +00001200 # tee pass-through to copyable iterator
1201 a, b = tee('abc')
1202 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001203 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001204
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001205 # test tee_new
1206 t1, t2 = tee('abc')
1207 tnew = type(t1)
1208 self.assertRaises(TypeError, tnew)
1209 self.assertRaises(TypeError, tnew, 10)
1210 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001211 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001212
Raymond Hettingera9f60922004-10-17 16:40:14 +00001213 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001214 a, b = tee(range(10))
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001215 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +00001216 self.assertEqual(getattr(p, '__class__'), type(b))
1217 del a
1218 self.assertRaises(ReferenceError, getattr, p, '__class__')
1219
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001220 ans = list('abc')
1221 long_ans = list(range(10000))
1222
1223 # check copy
1224 a, b = tee('abc')
1225 self.assertEqual(list(copy.copy(a)), ans)
1226 self.assertEqual(list(copy.copy(b)), ans)
1227 a, b = tee(list(range(10000)))
1228 self.assertEqual(list(copy.copy(a)), long_ans)
1229 self.assertEqual(list(copy.copy(b)), long_ans)
1230
1231 # check partially consumed copy
1232 a, b = tee('abc')
1233 take(2, a)
1234 take(1, b)
1235 self.assertEqual(list(copy.copy(a)), ans[2:])
1236 self.assertEqual(list(copy.copy(b)), ans[1:])
1237 self.assertEqual(list(a), ans[2:])
1238 self.assertEqual(list(b), ans[1:])
1239 a, b = tee(range(10000))
1240 take(100, a)
1241 take(60, b)
1242 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1243 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1244 self.assertEqual(list(a), long_ans[100:])
1245 self.assertEqual(list(b), long_ans[60:])
1246
1247 # check deepcopy
1248 a, b = tee('abc')
1249 self.assertEqual(list(copy.deepcopy(a)), ans)
1250 self.assertEqual(list(copy.deepcopy(b)), ans)
1251 self.assertEqual(list(a), ans)
1252 self.assertEqual(list(b), ans)
1253 a, b = tee(range(10000))
1254 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1255 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1256 self.assertEqual(list(a), long_ans)
1257 self.assertEqual(list(b), long_ans)
1258
1259 # check partially consumed deepcopy
1260 a, b = tee('abc')
1261 take(2, a)
1262 take(1, b)
1263 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1264 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1265 self.assertEqual(list(a), ans[2:])
1266 self.assertEqual(list(b), ans[1:])
1267 a, b = tee(range(10000))
1268 take(100, a)
1269 take(60, b)
1270 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1271 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1272 self.assertEqual(list(a), long_ans[100:])
1273 self.assertEqual(list(b), long_ans[60:])
1274
1275 # check pickle
1276 self.pickletest(iter(tee('abc')))
1277 a, b = tee('abc')
1278 self.pickletest(a, compare=ans)
1279 self.pickletest(b, compare=ans)
1280
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001281 # Issue 13454: Crash when deleting backward iterator from tee()
1282 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001283 forward, backward = tee(repeat(None, 20000000))
1284 any(forward) # exhaust the iterator
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001285 del backward
1286
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001287 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001288 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001289
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001290 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001291 self.assertRaises(StopIteration, next, f([]))
1292 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001293
Georg Brandla18af4e2007-04-21 15:47:16 +00001294 self.assertRaises(StopIteration, next, islice([], None))
1295 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001296
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001297 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001298 self.assertRaises(StopIteration, next, p)
1299 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001300 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001301 self.assertRaises(StopIteration, next, p)
1302 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001303
Georg Brandla18af4e2007-04-21 15:47:16 +00001304 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001305
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001306 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001307 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1308 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001309
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001310class TestExamples(unittest.TestCase):
1311
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001312 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001313 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1314
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001315 def test_accumulate_reducible(self):
1316 # check copy, deepcopy, pickle
1317 data = [1, 2, 3, 4, 5]
1318 accumulated = [1, 3, 6, 10, 15]
1319 it = accumulate(data)
1320
1321 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[:])
1322 self.assertEqual(next(it), 1)
1323 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[1:])
1324 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1325 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1326
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001327 def test_chain(self):
1328 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1329
1330 def test_chain_from_iterable(self):
1331 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1332
1333 def test_combinations(self):
1334 self.assertEqual(list(combinations('ABCD', 2)),
1335 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1336 self.assertEqual(list(combinations(range(4), 3)),
1337 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1338
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001339 def test_combinations_with_replacement(self):
1340 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1341 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1342
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001343 def test_compress(self):
1344 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1345
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001346 def test_count(self):
1347 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1348
1349 def test_cycle(self):
1350 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1351
1352 def test_dropwhile(self):
1353 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1354
1355 def test_groupby(self):
1356 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1357 list('ABCDAB'))
1358 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1359 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1360
1361 def test_filter(self):
1362 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1363
1364 def test_filterfalse(self):
1365 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1366
1367 def test_map(self):
1368 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1369
1370 def test_islice(self):
1371 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1372 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1373 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1374 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1375
1376 def test_zip(self):
1377 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1378
1379 def test_zip_longest(self):
1380 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1381 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1382
1383 def test_permutations(self):
1384 self.assertEqual(list(permutations('ABCD', 2)),
1385 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1386 self.assertEqual(list(permutations(range(3))),
1387 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1388
1389 def test_product(self):
1390 self.assertEqual(list(product('ABCD', 'xy')),
1391 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1392 self.assertEqual(list(product(range(2), repeat=3)),
1393 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1394 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1395
1396 def test_repeat(self):
1397 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1398
1399 def test_stapmap(self):
1400 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1401 [32, 9, 1000])
1402
1403 def test_takewhile(self):
1404 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1405
1406
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001407class TestGC(unittest.TestCase):
1408
1409 def makecycle(self, iterator, container):
1410 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001411 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001412 del container, iterator
1413
Raymond Hettinger482ba772010-12-01 22:48:00 +00001414 def test_accumulate(self):
1415 a = []
1416 self.makecycle(accumulate([1,2,a,3]), a)
1417
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001418 def test_chain(self):
1419 a = []
1420 self.makecycle(chain(a), a)
1421
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001422 def test_chain_from_iterable(self):
1423 a = []
1424 self.makecycle(chain.from_iterable([a]), a)
1425
1426 def test_combinations(self):
1427 a = []
1428 self.makecycle(combinations([1,2,a,3], 3), a)
1429
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001430 def test_combinations_with_replacement(self):
1431 a = []
1432 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1433
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001434 def test_compress(self):
1435 a = []
1436 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1437
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001438 def test_count(self):
1439 a = []
1440 Int = type('Int', (int,), dict(x=a))
1441 self.makecycle(count(Int(0), Int(1)), a)
1442
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001443 def test_cycle(self):
1444 a = []
1445 self.makecycle(cycle([a]*2), a)
1446
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001447 def test_dropwhile(self):
1448 a = []
1449 self.makecycle(dropwhile(bool, [0, a, a]), a)
1450
1451 def test_groupby(self):
1452 a = []
1453 self.makecycle(groupby([a]*2, lambda x:x), a)
1454
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001455 def test_issue2246(self):
1456 # Issue 2246 -- the _grouper iterator was not included in GC
1457 n = 10
1458 keyfunc = lambda x: x
1459 for i, j in groupby(range(n), key=keyfunc):
1460 keyfunc.__dict__.setdefault('x',[]).append(j)
1461
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001462 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001463 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001464 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001465
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001466 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001467 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001468 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001469
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001470 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001471 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001472 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001473
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001474 def test_zip_longest(self):
1475 a = []
1476 self.makecycle(zip_longest([a]*2, [a]*3), a)
1477 b = [a, None]
1478 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1479
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001480 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001481 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001482 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001483
1484 def test_islice(self):
1485 a = []
1486 self.makecycle(islice([a]*2, None), a)
1487
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001488 def test_permutations(self):
1489 a = []
1490 self.makecycle(permutations([1,2,a,3], 3), a)
1491
1492 def test_product(self):
1493 a = []
1494 self.makecycle(product([1,2,a,3], repeat=3), a)
1495
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001496 def test_repeat(self):
1497 a = []
1498 self.makecycle(repeat(a), a)
1499
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001500 def test_starmap(self):
1501 a = []
1502 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1503
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001504 def test_takewhile(self):
1505 a = []
1506 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1507
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001508def R(seqn):
1509 'Regular generator'
1510 for i in seqn:
1511 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001512
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001513class G:
1514 'Sequence using __getitem__'
1515 def __init__(self, seqn):
1516 self.seqn = seqn
1517 def __getitem__(self, i):
1518 return self.seqn[i]
1519
1520class I:
1521 'Sequence using iterator protocol'
1522 def __init__(self, seqn):
1523 self.seqn = seqn
1524 self.i = 0
1525 def __iter__(self):
1526 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001527 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001528 if self.i >= len(self.seqn): raise StopIteration
1529 v = self.seqn[self.i]
1530 self.i += 1
1531 return v
1532
1533class Ig:
1534 'Sequence using iterator protocol defined with a generator'
1535 def __init__(self, seqn):
1536 self.seqn = seqn
1537 self.i = 0
1538 def __iter__(self):
1539 for val in self.seqn:
1540 yield val
1541
1542class X:
1543 'Missing __getitem__ and __iter__'
1544 def __init__(self, seqn):
1545 self.seqn = seqn
1546 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001547 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001548 if self.i >= len(self.seqn): raise StopIteration
1549 v = self.seqn[self.i]
1550 self.i += 1
1551 return v
1552
1553class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001554 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001555 def __init__(self, seqn):
1556 self.seqn = seqn
1557 self.i = 0
1558 def __iter__(self):
1559 return self
1560
1561class E:
1562 'Test propagation of exceptions'
1563 def __init__(self, seqn):
1564 self.seqn = seqn
1565 self.i = 0
1566 def __iter__(self):
1567 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001568 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001569 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001570
1571class S:
1572 'Test immediate stop'
1573 def __init__(self, seqn):
1574 pass
1575 def __iter__(self):
1576 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001577 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001578 raise StopIteration
1579
1580def L(seqn):
1581 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001582 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001583
1584
1585class TestVariousIteratorArgs(unittest.TestCase):
1586
Raymond Hettinger482ba772010-12-01 22:48:00 +00001587 def test_accumulate(self):
1588 s = [1,2,3,4,5]
1589 r = [1,3,6,10,15]
1590 n = len(s)
1591 for g in (G, I, Ig, L, R):
1592 self.assertEqual(list(accumulate(g(s))), r)
1593 self.assertEqual(list(accumulate(S(s))), [])
1594 self.assertRaises(TypeError, accumulate, X(s))
1595 self.assertRaises(TypeError, accumulate, N(s))
1596 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1597
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001598 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001599 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001600 for g in (G, I, Ig, S, L, R):
1601 self.assertEqual(list(chain(g(s))), list(g(s)))
1602 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001603 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001604 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001605 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1606
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001607 def test_compress(self):
1608 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1609 n = len(s)
1610 for g in (G, I, Ig, S, L, R):
1611 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1612 self.assertRaises(TypeError, compress, X(s), repeat(1))
1613 self.assertRaises(TypeError, compress, N(s), repeat(1))
1614 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1615
Christian Heimesc3f30c42008-02-22 16:37:40 +00001616 def test_product(self):
1617 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1618 self.assertRaises(TypeError, product, X(s))
1619 self.assertRaises(TypeError, product, N(s))
1620 self.assertRaises(ZeroDivisionError, product, E(s))
1621
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001622 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001623 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001624 for g in (G, I, Ig, S, L, R):
1625 tgtlen = len(s) * 3
1626 expected = list(g(s))*3
1627 actual = list(islice(cycle(g(s)), tgtlen))
1628 self.assertEqual(actual, expected)
1629 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001630 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001631 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1632
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001633 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001634 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001635 for g in (G, I, Ig, S, L, R):
1636 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1637 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001638 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001639 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1640
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001641 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001642 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001643 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001644 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001645 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001646 self.assertRaises(TypeError, filter, isEven, X(s))
1647 self.assertRaises(TypeError, filter, isEven, N(s))
1648 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001649
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001650 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001651 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001652 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001653 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001654 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001655 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1656 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1657 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001658
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001659 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001660 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001661 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001662 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1663 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1664 self.assertRaises(TypeError, zip, X(s))
1665 self.assertRaises(TypeError, zip, N(s))
1666 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001667
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001668 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001669 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001670 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001671 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1672 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1673 self.assertRaises(TypeError, zip_longest, X(s))
1674 self.assertRaises(TypeError, zip_longest, N(s))
1675 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001676
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001677 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001678 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001679 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001680 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001681 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001682 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001683 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001684 self.assertRaises(TypeError, map, onearg, X(s))
1685 self.assertRaises(TypeError, map, onearg, N(s))
1686 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001687
1688 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001689 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001690 for g in (G, I, Ig, S, L, R):
1691 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1692 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001693 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001694 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1695
1696 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001697 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001698 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001699 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001700 self.assertEqual(list(starmap(operator.pow, g(ss))),
1701 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001702 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001703 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001704 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1705
1706 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001707 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001708 for g in (G, I, Ig, S, L, R):
1709 tgt = []
1710 for elem in g(s):
1711 if not isEven(elem): break
1712 tgt.append(elem)
1713 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1714 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001715 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001716 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1717
1718 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001719 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001720 for g in (G, I, Ig, S, L, R):
1721 tgt = []
1722 for elem in g(s):
1723 if not tgt and isOdd(elem): continue
1724 tgt.append(elem)
1725 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1726 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001727 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001728 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1729
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001730 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001731 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001732 for g in (G, I, Ig, S, L, R):
1733 it1, it2 = tee(g(s))
1734 self.assertEqual(list(it1), list(g(s)))
1735 self.assertEqual(list(it2), list(g(s)))
1736 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001737 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001738 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1739
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001740class LengthTransparency(unittest.TestCase):
1741
1742 def test_repeat(self):
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001743 self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
1744 self.assertEqual(operator.length_hint(repeat(None), 12), 12)
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001745
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001746class RegressionTests(unittest.TestCase):
1747
1748 def test_sf_793826(self):
1749 # Fix Armin Rigo's successful efforts to wreak havoc
1750
1751 def mutatingtuple(tuple1, f, tuple2):
1752 # this builds a tuple t which is a copy of tuple1,
1753 # then calls f(t), then mutates t to be equal to tuple2
1754 # (needs len(tuple1) == len(tuple2)).
1755 def g(value, first=[1]):
1756 if first:
1757 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001758 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001759 return value
1760 items = list(tuple2)
1761 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001762 gen = map(g, items)
1763 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001764 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001765
1766 def f(t):
1767 global T
1768 T = t
1769 first[:] = list(T)
1770
1771 first = []
1772 mutatingtuple((1,2,3), f, (4,5,6))
1773 second = list(T)
1774 self.assertEqual(first, second)
1775
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001776
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001777 def test_sf_950057(self):
1778 # Make sure that chain() and cycle() catch exceptions immediately
1779 # rather than when shifting between input sources
1780
1781 def gen1():
1782 hist.append(0)
1783 yield 1
1784 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001785 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001786 hist.append(2)
1787
1788 def gen2(x):
1789 hist.append(3)
1790 yield 2
1791 hist.append(4)
1792 if x:
1793 raise StopIteration
1794
1795 hist = []
1796 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1797 self.assertEqual(hist, [0,1])
1798
1799 hist = []
1800 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1801 self.assertEqual(hist, [0,1])
1802
1803 hist = []
1804 self.assertRaises(AssertionError, list, cycle(gen1()))
1805 self.assertEqual(hist, [0,1])
1806
Thomas Woutersb2137042007-02-01 18:02:27 +00001807class SubclassWithKwargsTest(unittest.TestCase):
1808 def test_keywords_in_subclass(self):
1809 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001810 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001811 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001812 class Subclass(cls):
1813 def __init__(self, newarg=None, *args):
1814 cls.__init__(self, *args)
1815 try:
1816 Subclass(newarg=1)
1817 except TypeError as err:
1818 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001819 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001820
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02001821@support.cpython_only
1822class SizeofTest(unittest.TestCase):
1823 def setUp(self):
1824 self.ssize_t = struct.calcsize('n')
1825
1826 check_sizeof = support.check_sizeof
1827
1828 def test_product_sizeof(self):
1829 basesize = support.calcobjsize('3Pi')
1830 check = self.check_sizeof
1831 check(product('ab', '12'), basesize + 2 * self.ssize_t)
1832 check(product(*(('abc',) * 10)), basesize + 10 * self.ssize_t)
1833
1834 def test_combinations_sizeof(self):
1835 basesize = support.calcobjsize('3Pni')
1836 check = self.check_sizeof
1837 check(combinations('abcd', 3), basesize + 3 * self.ssize_t)
1838 check(combinations(range(10), 4), basesize + 4 * self.ssize_t)
1839
1840 def test_combinations_with_replacement_sizeof(self):
1841 cwr = combinations_with_replacement
1842 basesize = support.calcobjsize('3Pni')
1843 check = self.check_sizeof
1844 check(cwr('abcd', 3), basesize + 3 * self.ssize_t)
1845 check(cwr(range(10), 4), basesize + 4 * self.ssize_t)
1846
1847 def test_permutations_sizeof(self):
1848 basesize = support.calcobjsize('4Pni')
1849 check = self.check_sizeof
1850 check(permutations('abcd'),
1851 basesize + 4 * self.ssize_t + 4 * self.ssize_t)
1852 check(permutations('abcd', 3),
1853 basesize + 4 * self.ssize_t + 3 * self.ssize_t)
1854 check(permutations('abcde', 3),
1855 basesize + 5 * self.ssize_t + 3 * self.ssize_t)
1856 check(permutations(range(10), 4),
1857 basesize + 10 * self.ssize_t + 4 * self.ssize_t)
1858
Thomas Woutersb2137042007-02-01 18:02:27 +00001859
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001860libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001861
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001862
1863>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001864>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001865... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001866...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001867Check 1200 is for $120.15
1868Check 1201 is for $764.05
1869Check 1202 is for $823.14
1870
1871>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001872>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001873... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001874...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000018751
18768
187727
1878
1879>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001880>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001881... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001882...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001883Alex
1884Laura
1885Martin
1886Walter
1887Samuele
1888
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001889>>> from operator import itemgetter
1890>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001891>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001892>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001893... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001894...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000018951 ['a', 'c', 'e']
18962 ['b', 'd', 'f']
18973 ['g']
1898
Raymond Hettinger734fb572004-01-20 20:04:40 +00001899# Find runs of consecutive numbers using groupby. The key to the solution
1900# is differencing with a range so that consecutive numbers all appear in
1901# same group.
1902>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001903>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001904... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001905...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001906[1]
1907[4, 5, 6]
1908[10]
1909[15, 16, 17, 18]
1910[22]
1911[25, 26, 27, 28]
1912
Georg Brandl3dbca812008-07-23 16:10:53 +00001913>>> def take(n, iterable):
1914... "Return first n items of the iterable as a list"
1915... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001916
Georg Brandl3dbca812008-07-23 16:10:53 +00001917>>> def enumerate(iterable, start=0):
1918... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001919
Georg Brandl3dbca812008-07-23 16:10:53 +00001920>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001921... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001922... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001923
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00001924>>> def nth(iterable, n, default=None):
1925... "Returns the nth item or a default value"
1926... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001927
Georg Brandl3dbca812008-07-23 16:10:53 +00001928>>> def quantify(iterable, pred=bool):
1929... "Count how many times the predicate is true"
1930... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001931
Georg Brandl3dbca812008-07-23 16:10:53 +00001932>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001933... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001934... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001935
Georg Brandl3dbca812008-07-23 16:10:53 +00001936>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02001937... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00001938... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001939
1940>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001941... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001942
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001943>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001944... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001945
1946>>> def repeatfunc(func, times=None, *args):
1947... "Repeat calls to func with specified arguments."
1948... " Example: repeatfunc(random.random)"
1949... if times is None:
1950... return starmap(func, repeat(args))
1951... else:
1952... return starmap(func, repeat(args, times))
1953
Raymond Hettingerd591f662003-10-26 15:34:50 +00001954>>> def pairwise(iterable):
1955... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1956... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001957... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001958... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001959... except StopIteration:
1960... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001961... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001962
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001963>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001964... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001965... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001966... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001967
1968>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001969... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001970... # Recipe credited to George Sakkis
1971... pending = len(iterables)
1972... nexts = cycle(iter(it).__next__ for it in iterables)
1973... while pending:
1974... try:
1975... for next in nexts:
1976... yield next()
1977... except StopIteration:
1978... pending -= 1
1979... nexts = cycle(islice(nexts, pending))
1980
1981>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001982... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1983... s = list(iterable)
1984... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001985
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001986>>> def unique_everseen(iterable, key=None):
1987... "List unique elements, preserving order. Remember all elements ever seen."
1988... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1989... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1990... seen = set()
1991... seen_add = seen.add
1992... if key is None:
1993... for element in iterable:
1994... if element not in seen:
1995... seen_add(element)
1996... yield element
1997... else:
1998... for element in iterable:
1999... k = key(element)
2000... if k not in seen:
2001... seen_add(k)
2002... yield element
2003
2004>>> def unique_justseen(iterable, key=None):
2005... "List unique elements, preserving order. Remember only the element just seen."
2006... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
2007... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
2008... return map(next, map(itemgetter(1), groupby(iterable, key)))
2009
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002010>>> def first_true(iterable, default=False, pred=None):
2011... '''Returns the first true value in the iterable.
2012...
2013... If no true value is found, returns *default*
2014...
2015... If *pred* is not None, returns the first item
2016... for which pred(item) is true.
2017...
2018... '''
2019... # first_true([a,b,c], x) --> a or b or c or x
2020... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
2021... return next(filter(pred, iterable), default)
2022
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002023This is not part of the examples but it tests to make sure the definitions
2024perform as purported.
2025
Raymond Hettingera098b332003-09-08 23:58:40 +00002026>>> take(10, count())
2027[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2028
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002029>>> list(enumerate('abc'))
2030[(0, 'a'), (1, 'b'), (2, 'c')]
2031
2032>>> list(islice(tabulate(lambda x: 2*x), 4))
2033[0, 2, 4, 6]
2034
2035>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00002036'd'
2037
2038>>> nth('abcde', 9) is None
2039True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002040
Guido van Rossum805365e2007-05-07 22:24:25 +00002041>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000204250
2043
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002044>>> a = [[1, 2, 3], [4, 5, 6]]
2045>>> flatten(a)
2046[1, 2, 3, 4, 5, 6]
2047
2048>>> list(repeatfunc(pow, 5, 2, 3))
2049[8, 8, 8, 8, 8]
2050
2051>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002052>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002053[0, 0, 0, 0, 0]
2054
Raymond Hettingerd591f662003-10-26 15:34:50 +00002055>>> list(pairwise('abcd'))
2056[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002057
Raymond Hettingerd591f662003-10-26 15:34:50 +00002058>>> list(pairwise([]))
2059[]
2060
2061>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002062[]
2063
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002064>>> list(islice(padnone('abc'), 0, 6))
2065['a', 'b', 'c', None, None, None]
2066
2067>>> list(ncycles('abc', 3))
2068['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2069
2070>>> dotproduct([1,2,3], [4,5,6])
207132
2072
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002073>>> list(grouper(3, 'abcdefg', 'x'))
2074[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2075
2076>>> list(roundrobin('abc', 'd', 'ef'))
2077['a', 'd', 'e', 'b', 'f', 'c']
2078
Raymond Hettingerace67332009-01-26 02:23:50 +00002079>>> list(powerset([1,2,3]))
2080[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002081
Raymond Hettinger191e8502009-01-27 13:29:43 +00002082>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2083True
2084
2085>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2086True
2087
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002088>>> list(unique_everseen('AAAABBBCCDAABBB'))
2089['A', 'B', 'C', 'D']
2090
2091>>> list(unique_everseen('ABBCcAD', str.lower))
2092['A', 'B', 'C', 'D']
2093
2094>>> list(unique_justseen('AAAABBBCCDAABBB'))
2095['A', 'B', 'C', 'D', 'A', 'B']
2096
2097>>> list(unique_justseen('ABBCcAD', str.lower))
2098['A', 'B', 'C', 'A', 'D']
2099
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002100>>> first_true('ABC0DEF1', '9', str.isdigit)
2101'0'
2102
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002103"""
2104
2105__test__ = {'libreftest' : libreftest}
2106
2107def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002108 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002109 RegressionTests, LengthTransparency,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002110 SubclassWithKwargsTest, TestExamples,
2111 SizeofTest)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002112 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002113
2114 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002115 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002116 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002117 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002118 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002119 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002120 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002121 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002122 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002123
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002124 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002125 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002126
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002127if __name__ == "__main__":
2128 test_main(verbose=True)