blob: eaa6197bec395c654cd3f407c783d22db2493e8e [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 Hettinger7c2bb5b2003-05-03 05:59:48 +00007import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00008import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +00009import copy
10import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000011from functools import reduce
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +020012import sys
13import struct
Miss Islington (bot)6e3809c2019-09-09 02:07:51 -070014import threading
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
Serhiy Storchakabad12572014-12-15 14:03:42 +020077picklecopiers = [lambda s, proto=proto: pickle.loads(pickle.dumps(s, proto))
78 for proto in range(pickle.HIGHEST_PROTOCOL + 1)]
79
Raymond Hettinger96ef8112003-02-01 00:10:11 +000080class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000081
Serhiy Storchakabad12572014-12-15 14:03:42 +020082 def pickletest(self, protocol, it, stop=4, take=1, compare=None):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000083 """Test that an iterator is the same after pickling, also when part-consumed"""
84 def expand(it, i=0):
85 # Recursively expand iterables, within sensible bounds
86 if i > 10:
87 raise RuntimeError("infinite recursion encountered")
88 if isinstance(it, str):
89 return it
90 try:
91 l = list(islice(it, stop))
92 except TypeError:
93 return it # can't expand it
94 return [expand(e, i+1) for e in l]
95
96 # Test the initial copy against the original
Serhiy Storchakabad12572014-12-15 14:03:42 +020097 dump = pickle.dumps(it, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000098 i2 = pickle.loads(dump)
99 self.assertEqual(type(it), type(i2))
100 a, b = expand(it), expand(i2)
101 self.assertEqual(a, b)
102 if compare:
103 c = expand(compare)
104 self.assertEqual(a, c)
105
106 # Take from the copy, and create another copy and compare them.
107 i3 = pickle.loads(dump)
108 took = 0
109 try:
110 for i in range(take):
111 next(i3)
112 took += 1
113 except StopIteration:
114 pass #in case there is less data than 'take'
Serhiy Storchakabad12572014-12-15 14:03:42 +0200115 dump = pickle.dumps(i3, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000116 i4 = pickle.loads(dump)
117 a, b = expand(i3), expand(i4)
118 self.assertEqual(a, b)
119 if compare:
120 c = expand(compare[took:])
121 self.assertEqual(a, c);
122
Raymond Hettinger482ba772010-12-01 22:48:00 +0000123 def test_accumulate(self):
124 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000125 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
126 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
127 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000128 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000129 self.assertEqual(
130 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000131 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000132 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000133 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000134 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700135 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000136 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000137 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000138 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
139
Raymond Hettinger5d446132011-03-27 18:52:10 -0700140 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
141 self.assertEqual(list(accumulate(s, min)),
142 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
143 self.assertEqual(list(accumulate(s, max)),
144 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
145 self.assertEqual(list(accumulate(s, operator.mul)),
146 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
147 with self.assertRaises(TypeError):
148 list(accumulate(s, chr)) # unary-operation
Serhiy Storchakabad12572014-12-15 14:03:42 +0200149 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
150 self.pickletest(proto, accumulate(range(10))) # test pickling
Lisa Roach9718b592018-09-23 17:34:59 -0700151 self.pickletest(proto, accumulate(range(10), initial=7))
152 self.assertEqual(list(accumulate([10, 5, 1], initial=None)), [10, 15, 16])
153 self.assertEqual(list(accumulate([10, 5, 1], initial=100)), [100, 110, 115, 116])
154 self.assertEqual(list(accumulate([], initial=100)), [100])
155 with self.assertRaises(TypeError):
156 list(accumulate([10, 20], 100))
Raymond Hettinger5d446132011-03-27 18:52:10 -0700157
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000158 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000159
160 def chain2(*iterables):
161 'Pure python version in the docs'
162 for it in iterables:
163 for element in it:
164 yield element
165
166 for c in (chain, chain2):
167 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
168 self.assertEqual(list(c('abc')), list('abc'))
169 self.assertEqual(list(c('')), [])
170 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
171 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000172
173 def test_chain_from_iterable(self):
174 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
175 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
176 self.assertEqual(list(chain.from_iterable([''])), [])
177 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
178 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000179
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000180 def test_chain_reducible(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200181 for oper in [copy.deepcopy] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000182 it = chain('abc', 'def')
183 self.assertEqual(list(oper(it)), list('abcdef'))
184 self.assertEqual(next(it), 'a')
185 self.assertEqual(list(oper(it)), list('bcdef'))
186
187 self.assertEqual(list(oper(chain(''))), [])
188 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
189 self.assertRaises(TypeError, list, oper(chain(2, 3)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200190 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
191 self.pickletest(proto, chain('abc', 'def'), compare=list('abcdef'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000192
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300193 def test_chain_setstate(self):
194 self.assertRaises(TypeError, chain().__setstate__, ())
195 self.assertRaises(TypeError, chain().__setstate__, [])
196 self.assertRaises(TypeError, chain().__setstate__, 0)
197 self.assertRaises(TypeError, chain().__setstate__, ([],))
198 self.assertRaises(TypeError, chain().__setstate__, (iter([]), []))
199 it = chain()
200 it.__setstate__((iter(['abc', 'def']),))
201 self.assertEqual(list(it), ['a', 'b', 'c', 'd', 'e', 'f'])
202 it = chain()
203 it.__setstate__((iter(['abc', 'def']), iter(['ghi'])))
204 self.assertEqual(list(it), ['ghi', 'a', 'b', 'c', 'd', 'e', 'f'])
205
Christian Heimes380f7f22008-02-28 11:19:05 +0000206 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000207 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000208 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000209 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000210 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000211
Serhiy Storchakabad12572014-12-15 14:03:42 +0200212 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000213 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
214
215 self.assertEqual(list(op(combinations('ABCD', 2))),
216 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
217 testIntermediate = combinations('ABCD', 2)
218 next(testIntermediate)
219 self.assertEqual(list(op(testIntermediate)),
220 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
221
222 self.assertEqual(list(op(combinations(range(4), 3))),
223 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
224 testIntermediate = combinations(range(4), 3)
225 next(testIntermediate)
226 self.assertEqual(list(op(testIntermediate)),
227 [(0,1,3), (0,2,3), (1,2,3)])
228
Christian Heimes78644762008-03-04 23:39:23 +0000229
230 def combinations1(iterable, r):
231 'Pure python version shown in the docs'
232 pool = tuple(iterable)
233 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000234 if r > n:
235 return
Christian Heimes78644762008-03-04 23:39:23 +0000236 indices = list(range(r))
237 yield tuple(pool[i] for i in indices)
238 while 1:
239 for i in reversed(range(r)):
240 if indices[i] != i + n - r:
241 break
242 else:
243 return
244 indices[i] += 1
245 for j in range(i+1, r):
246 indices[j] = indices[j-1] + 1
247 yield tuple(pool[i] for i in indices)
248
249 def combinations2(iterable, r):
250 'Pure python version shown in the docs'
251 pool = tuple(iterable)
252 n = len(pool)
253 for indices in permutations(range(n), r):
254 if sorted(indices) == list(indices):
255 yield tuple(pool[i] for i in indices)
256
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000257 def combinations3(iterable, r):
258 'Pure python version from cwr()'
259 pool = tuple(iterable)
260 n = len(pool)
261 for indices in combinations_with_replacement(range(n), r):
262 if len(set(indices)) == r:
263 yield tuple(pool[i] for i in indices)
264
Christian Heimes78644762008-03-04 23:39:23 +0000265 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000266 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000267 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000268 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000269 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 +0000270 self.assertEqual(len(result), len(set(result))) # no repeats
271 self.assertEqual(result, sorted(result)) # lexicographic order
272 for c in result:
273 self.assertEqual(len(c), r) # r-length combinations
274 self.assertEqual(len(set(c)), r) # no duplicate elements
275 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000277 self.assertEqual(list(c),
278 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000279 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000280 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000281 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000282
Serhiy Storchakabad12572014-12-15 14:03:42 +0200283 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
284 self.pickletest(proto, combinations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000285
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500286 @support.bigaddrspacetest
287 def test_combinations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200288 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500289 combinations("AA", 2**29)
290
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000291 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700292 @support.impl_detail("tuple reuse is specific to CPython")
293 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000294 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
295 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
296
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000297 def test_combinations_with_replacement(self):
298 cwr = combinations_with_replacement
299 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
300 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
301 self.assertRaises(TypeError, cwr, None) # pool is not iterable
302 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000303
Serhiy Storchakabad12572014-12-15 14:03:42 +0200304 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000305 self.assertEqual(list(op(cwr('ABC', 2))),
306 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
307 testIntermediate = cwr('ABC', 2)
308 next(testIntermediate)
309 self.assertEqual(list(op(testIntermediate)),
310 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
311
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000312
313 def cwr1(iterable, r):
314 'Pure python version shown in the docs'
315 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
316 pool = tuple(iterable)
317 n = len(pool)
318 if not n and r:
319 return
320 indices = [0] * r
321 yield tuple(pool[i] for i in indices)
322 while 1:
323 for i in reversed(range(r)):
324 if indices[i] != n - 1:
325 break
326 else:
327 return
328 indices[i:] = [indices[i] + 1] * (r - i)
329 yield tuple(pool[i] for i in indices)
330
331 def cwr2(iterable, r):
332 'Pure python version shown in the docs'
333 pool = tuple(iterable)
334 n = len(pool)
335 for indices in product(range(n), repeat=r):
336 if sorted(indices) == list(indices):
337 yield tuple(pool[i] for i in indices)
338
339 def numcombs(n, r):
340 if not n:
341 return 0 if r else 1
342 return fact(n+r-1) / fact(r)/ fact(n-1)
343
344 for n in range(7):
345 values = [5*x-12 for x in range(n)]
346 for r in range(n+2):
347 result = list(cwr(values, r))
348
349 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
350 self.assertEqual(len(result), len(set(result))) # no repeats
351 self.assertEqual(result, sorted(result)) # lexicographic order
352
353 regular_combs = list(combinations(values, r)) # compare to combs without replacement
354 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000355 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000356 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000357 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000358
359 for c in result:
360 self.assertEqual(len(c), r) # r-length combinations
361 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
362 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
363 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000364 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000365 self.assertEqual(noruns,
366 [e for e in values if e in c]) # comb is a subsequence of the input iterable
367 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
368 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
369
Serhiy Storchakabad12572014-12-15 14:03:42 +0200370 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
371 self.pickletest(proto, cwr(values,r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000372
Benjamin Peterson6f082292015-02-01 21:10:47 -0500373 @support.bigaddrspacetest
374 def test_combinations_with_replacement_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200375 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson6f082292015-02-01 21:10:47 -0500376 combinations_with_replacement("AA", 2**30)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000377
Benjamin Peterson6f082292015-02-01 21:10:47 -0500378 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700379 @support.impl_detail("tuple reuse is specific to CPython")
380 def test_combinations_with_replacement_tuple_reuse(self):
381 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000382 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
383 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
384
Christian Heimes78644762008-03-04 23:39:23 +0000385 def test_permutations(self):
386 self.assertRaises(TypeError, permutations) # too few arguments
387 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000388 self.assertRaises(TypeError, permutations, None) # pool is not iterable
389 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000390 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000391 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000392 self.assertEqual(list(permutations(range(3), 2)),
393 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
394
395 def permutations1(iterable, r=None):
396 'Pure python version shown in the docs'
397 pool = tuple(iterable)
398 n = len(pool)
399 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000400 if r > n:
401 return
Christian Heimes78644762008-03-04 23:39:23 +0000402 indices = list(range(n))
403 cycles = list(range(n-r+1, n+1))[::-1]
404 yield tuple(pool[i] for i in indices[:r])
405 while n:
406 for i in reversed(range(r)):
407 cycles[i] -= 1
408 if cycles[i] == 0:
409 indices[i:] = indices[i+1:] + indices[i:i+1]
410 cycles[i] = n - i
411 else:
412 j = cycles[i]
413 indices[i], indices[-j] = indices[-j], indices[i]
414 yield tuple(pool[i] for i in indices[:r])
415 break
416 else:
417 return
418
419 def permutations2(iterable, r=None):
420 'Pure python version shown in the docs'
421 pool = tuple(iterable)
422 n = len(pool)
423 r = n if r is None else r
424 for indices in product(range(n), repeat=r):
425 if len(set(indices)) == r:
426 yield tuple(pool[i] for i in indices)
427
428 for n in range(7):
429 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000430 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000431 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000432 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 +0000433 self.assertEqual(len(result), len(set(result))) # no repeats
434 self.assertEqual(result, sorted(result)) # lexicographic order
435 for p in result:
436 self.assertEqual(len(p), r) # r-length permutations
437 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000438 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000439 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000440 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000441 if r == n:
442 self.assertEqual(result, list(permutations(values, None))) # test r as None
443 self.assertEqual(result, list(permutations(values))) # test default r
444
Serhiy Storchakabad12572014-12-15 14:03:42 +0200445 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
446 self.pickletest(proto, permutations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000447
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500448 @support.bigaddrspacetest
449 def test_permutations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200450 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500451 permutations("A", 2**30)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500452
Zachary Waredca807b2014-04-24 13:22:05 -0500453 @support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynore151d212011-07-17 16:21:30 -0700454 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000455 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000456 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000457
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000458 def test_combinatorics(self):
459 # Test relationships between product(), permutations(),
460 # combinations() and combinations_with_replacement().
461
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000462 for n in range(6):
463 s = 'ABCDEFG'[:n]
464 for r in range(8):
465 prod = list(product(s, repeat=r))
466 cwr = list(combinations_with_replacement(s, r))
467 perm = list(permutations(s, r))
468 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000469
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000470 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000471 self.assertEqual(len(prod), n**r)
472 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
473 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
474 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000475
476 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000477 self.assertEqual(prod, sorted(set(prod)))
478 self.assertEqual(cwr, sorted(set(cwr)))
479 self.assertEqual(perm, sorted(set(perm)))
480 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000481
482 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000483 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
484 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 +0000485 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
486 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
487 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
488 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
489 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000490
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000491 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000492 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000493 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
494 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
495 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
496 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
497 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
498 n = 10000
499 data = chain.from_iterable(repeat(range(6), n))
500 selectors = chain.from_iterable(repeat((0, 1)))
501 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
502 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
503 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
504 self.assertRaises(TypeError, compress, range(6)) # too few args
505 self.assertRaises(TypeError, compress, range(6), None) # too many args
506
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000507 # check copy, deepcopy, pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +0200508 for op in [lambda a:copy.copy(a), lambda a:copy.deepcopy(a)] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000509 for data, selectors, result1, result2 in [
510 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
511 ('ABCDEF', [0,0,0,0,0,0], '', ''),
512 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
513 ('ABCDEF', [1,0,1], 'AC', 'C'),
514 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
515 ]:
516
517 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
518 self.assertEqual(list(op(compress(data, selectors))), list(result1))
519 testIntermediate = compress(data, selectors)
520 if result1:
521 next(testIntermediate)
522 self.assertEqual(list(op(testIntermediate)), list(result2))
523
524
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000525 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000526 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
527 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
528 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000529 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
530 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000531 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000532 self.assertRaises(TypeError, count, 'a')
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300533 self.assertEqual(take(10, count(maxsize-5)),
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000534 list(range(maxsize-5, maxsize+5)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300535 self.assertEqual(take(10, count(-maxsize-5)),
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000536 list(range(-maxsize-5, -maxsize+5)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300537 self.assertEqual(take(3, count(3.25)), [3.25, 4.25, 5.25])
538 self.assertEqual(take(3, count(3.25-4j)), [3.25-4j, 4.25-4j, 5.25-4j])
539 self.assertEqual(take(3, count(Decimal('1.1'))),
540 [Decimal('1.1'), Decimal('2.1'), Decimal('3.1')])
541 self.assertEqual(take(3, count(Fraction(2, 3))),
542 [Fraction(2, 3), Fraction(5, 3), Fraction(8, 3)])
543 BIGINT = 1<<1000
544 self.assertEqual(take(3, count(BIGINT)), [BIGINT, BIGINT+1, BIGINT+2])
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000545 c = count(3)
546 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000547 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000548 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 c = count(-9)
550 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000551 next(c)
552 self.assertEqual(next(c), -8)
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300553 self.assertEqual(repr(count(10.25)), 'count(10.25)')
554 self.assertEqual(repr(count(10.0)), 'count(10.0)')
555 self.assertEqual(type(next(count(10.0))), float)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000556 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 +0300557 # Test repr
558 r1 = repr(count(i))
559 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000560 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000561
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000562 # check copy, deepcopy, pickle
563 for value in -3, 3, maxsize-5, maxsize+5:
564 c = count(value)
565 self.assertEqual(next(copy.copy(c)), value)
566 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200567 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
568 self.pickletest(proto, count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000569
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000570 #check proper internal error handling for large "step' sizes
571 count(1, maxsize+5); sys.exc_info()
572
Raymond Hettinger30729212009-02-12 06:28:27 +0000573 def test_count_with_stride(self):
574 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000575 self.assertEqual(lzip('abc',count(start=2,step=3)),
576 [('a', 2), ('b', 5), ('c', 8)])
577 self.assertEqual(lzip('abc',count(step=-1)),
578 [('a', 0), ('b', -1), ('c', -2)])
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300579 self.assertRaises(TypeError, count, 'a', 'b')
Raymond Hettinger30729212009-02-12 06:28:27 +0000580 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
581 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000582 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000583 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
584 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300585 self.assertEqual(take(3, count(10, maxsize+5)),
586 list(range(10, 10+3*(maxsize+5), maxsize+5)))
587 self.assertEqual(take(3, count(2, 1.25)), [2, 3.25, 4.5])
Raymond Hettinger30729212009-02-12 06:28:27 +0000588 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000589 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
590 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000591 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
592 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300593 BIGINT = 1<<1000
594 self.assertEqual(take(3, count(step=BIGINT)), [0, BIGINT, 2*BIGINT])
Raymond Hettinger30729212009-02-12 06:28:27 +0000595 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
596 c = count(3, 5)
597 self.assertEqual(repr(c), 'count(3, 5)')
598 next(c)
599 self.assertEqual(repr(c), 'count(8, 5)')
600 c = count(-9, 0)
601 self.assertEqual(repr(c), 'count(-9, 0)')
602 next(c)
603 self.assertEqual(repr(c), 'count(-9, 0)')
604 c = count(-9, -3)
605 self.assertEqual(repr(c), 'count(-9, -3)')
606 next(c)
607 self.assertEqual(repr(c), 'count(-12, -3)')
608 self.assertEqual(repr(c), 'count(-12, -3)')
609 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
610 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
611 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300612 self.assertEqual(repr(count(10, 1.00)), 'count(10, 1.0)')
613 c = count(10, 1.0)
614 self.assertEqual(type(next(c)), int)
615 self.assertEqual(type(next(c)), float)
Raymond Hettinger30729212009-02-12 06:28:27 +0000616 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
617 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 +0300618 # Test repr
619 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000620 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300621 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000622 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300623 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000624 self.assertEqual(r1, r2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200625 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
626 self.pickletest(proto, count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000627
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000628 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000629 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000630 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000631 self.assertRaises(TypeError, cycle)
632 self.assertRaises(TypeError, cycle, 5)
633 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000634
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000635 # check copy, deepcopy, pickle
636 c = cycle('abc')
637 self.assertEqual(next(c), 'a')
638 #simple copy currently not supported, because __reduce__ returns
639 #an internal iterator
640 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
641 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200642 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
643 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
644 list('bcabcabcab'))
645 next(c)
646 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
647 list('cabcabcabc'))
648 next(c)
649 next(c)
650 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
651 self.pickletest(proto, cycle('abc'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000652
Raymond Hettingera166ce52015-08-15 14:45:49 -0700653 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
654 # test with partial consumed input iterable
655 it = iter('abcde')
656 c = cycle(it)
Raymond Hettinger1cadf762015-08-15 14:47:27 -0700657 _ = [next(c) for i in range(2)] # consume 2 of 5 inputs
Raymond Hettingera166ce52015-08-15 14:45:49 -0700658 p = pickle.dumps(c, proto)
659 d = pickle.loads(p) # rebuild the cycle object
660 self.assertEqual(take(20, d), list('cdeabcdeabcdeabcdeab'))
661
662 # test with completely consumed input iterable
663 it = iter('abcde')
664 c = cycle(it)
Raymond Hettinger1cadf762015-08-15 14:47:27 -0700665 _ = [next(c) for i in range(7)] # consume 7 of 5 inputs
Raymond Hettingera166ce52015-08-15 14:45:49 -0700666 p = pickle.dumps(c, proto)
667 d = pickle.loads(p) # rebuild the cycle object
668 self.assertEqual(take(20, d), list('cdeabcdeabcdeabcdeab'))
669
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700670 def test_cycle_setstate(self):
671 # Verify both modes for restoring state
672
673 # Mode 0 is efficient. It uses an incompletely consumed input
674 # iterator to build a cycle object and then passes in state with
675 # a list of previously consumed values. There is no data
Martin Panterf1579822016-05-26 06:03:33 +0000676 # overlap between the two.
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700677 c = cycle('defg')
678 c.__setstate__((list('abc'), 0))
679 self.assertEqual(take(20, c), list('defgabcdefgabcdefgab'))
680
681 # Mode 1 is inefficient. It starts with a cycle object built
682 # from an iterator over the remaining elements in a partial
683 # cycle and then passes in state with all of the previously
684 # seen values (this overlaps values included in the iterator).
685 c = cycle('defg')
686 c.__setstate__((list('abcdefg'), 1))
687 self.assertEqual(take(20, c), list('defgabcdefgabcdefgab'))
688
689 # The first argument to setstate needs to be a tuple
Serhiy Storchaka8f0f2052016-10-02 09:13:14 +0300690 with self.assertRaises(TypeError):
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700691 cycle('defg').__setstate__([list('abcdefg'), 0])
692
693 # The first argument in the setstate tuple must be a list
694 with self.assertRaises(TypeError):
695 c = cycle('defg')
Serhiy Storchaka8f0f2052016-10-02 09:13:14 +0300696 c.__setstate__((tuple('defg'), 0))
697 take(20, c)
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700698
Serhiy Storchaka8f0f2052016-10-02 09:13:14 +0300699 # The second argument in the setstate tuple must be an int
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700700 with self.assertRaises(TypeError):
701 cycle('defg').__setstate__((list('abcdefg'), 'x'))
702
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300703 self.assertRaises(TypeError, cycle('').__setstate__, ())
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300704 self.assertRaises(TypeError, cycle('').__setstate__, ([],))
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300705
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000706 def test_groupby(self):
707 # Check whether it accepts arguments correctly
708 self.assertEqual([], list(groupby([])))
709 self.assertEqual([], list(groupby([], key=id)))
710 self.assertRaises(TypeError, list, groupby('abc', []))
711 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000712 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000713
714 # Check normal input
715 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
716 (2,15,22), (3,16,23), (3,17,23)]
717 dup = []
718 for k, g in groupby(s, lambda r:r[0]):
719 for elem in g:
720 self.assertEqual(k, elem[0])
721 dup.append(elem)
722 self.assertEqual(s, dup)
723
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000724 # Check normal pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200725 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
726 dup = []
727 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
728 for elem in g:
729 self.assertEqual(k, elem[0])
730 dup.append(elem)
731 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000732
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000733 # Check nested case
734 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000735 for k, g in groupby(s, testR):
736 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000737 for elem in ig:
738 self.assertEqual(k, elem[0])
739 self.assertEqual(ik, elem[2])
740 dup.append(elem)
741 self.assertEqual(s, dup)
742
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000743 # Check nested and pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200744 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
745 dup = []
746 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
747 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2), proto)):
748 for elem in ig:
749 self.assertEqual(k, elem[0])
750 self.assertEqual(ik, elem[2])
751 dup.append(elem)
752 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000753
754
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000755 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000756 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000757 expectedkeys = set([r[0] for r in s])
758 self.assertEqual(set(keys), expectedkeys)
759 self.assertEqual(len(keys), len(expectedkeys))
760
Serhiy Storchakac247caf2017-09-24 13:36:11 +0300761 # Check case where inner iterator is used after advancing the groupby
762 # iterator
763 s = list(zip('AABBBAAAA', range(9)))
764 it = groupby(s, testR)
765 _, g1 = next(it)
766 _, g2 = next(it)
767 _, g3 = next(it)
768 self.assertEqual(list(g1), [])
769 self.assertEqual(list(g2), [])
770 self.assertEqual(next(g3), ('A', 5))
771 list(it) # exhaust the groupby iterator
772 self.assertEqual(list(g3), [])
773
774 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
775 it = groupby(s, testR)
776 _, g = next(it)
777 next(it)
778 next(it)
779 self.assertEqual(list(pickle.loads(pickle.dumps(g, proto))), [])
780
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000781 # Exercise pipes and filters style
782 s = 'abracadabra'
783 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000784 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000785 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
786 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000787 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000788 self.assertEqual(r, ['a', 'b', 'r'])
789 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000790 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000791 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
792 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000793 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000794 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
795
Georg Brandla18af4e2007-04-21 15:47:16 +0000796 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000797 class ExpectedError(Exception):
798 pass
799 def delayed_raise(n=0):
800 for i in range(n):
801 yield 'yo'
802 raise ExpectedError
803 def gulp(iterable, keyp=None, func=list):
804 return [func(g) for k, g in groupby(iterable, keyp)]
805
Georg Brandla18af4e2007-04-21 15:47:16 +0000806 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000807 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000808 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000809 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
810
Serhiy Storchakaa60c2fe2015-03-12 21:56:08 +0200811 # __eq__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000812 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000813 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000814 raise ExpectedError
815 s = [DummyCmp(), DummyCmp(), None]
816
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000817 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000818 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000819 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000820 self.assertRaises(ExpectedError, gulp, s)
821
822 # keyfunc failure
823 def keyfunc(obj):
824 if keyfunc.skip > 0:
825 keyfunc.skip -= 1
826 return obj
827 else:
828 raise ExpectedError
829
830 # keyfunc failure on outer object
831 keyfunc.skip = 0
832 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
833 keyfunc.skip = 1
834 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
835
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000836 def test_filter(self):
837 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
838 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
839 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
840 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
841 self.assertRaises(TypeError, filter)
842 self.assertRaises(TypeError, filter, lambda x:x)
843 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
844 self.assertRaises(TypeError, filter, isEven, 3)
845 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000846
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000847 # check copy, deepcopy, pickle
848 ans = [0,2,4]
849
850 c = filter(isEven, range(6))
851 self.assertEqual(list(copy.copy(c)), ans)
852 c = filter(isEven, range(6))
853 self.assertEqual(list(copy.deepcopy(c)), ans)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200854 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
855 c = filter(isEven, range(6))
856 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans)
857 next(c)
858 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans[1:])
859 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
860 c = filter(isEven, range(6))
861 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000862
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000863 def test_filterfalse(self):
864 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
865 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
866 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
867 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
868 self.assertRaises(TypeError, filterfalse)
869 self.assertRaises(TypeError, filterfalse, lambda x:x)
870 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
871 self.assertRaises(TypeError, filterfalse, isEven, 3)
872 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200873 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
874 self.pickletest(proto, filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000875
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000876 def test_zip(self):
877 # XXX This is rather silly now that builtin zip() calls zip()...
878 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000879 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000880 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
881 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
882 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
883 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
884 self.assertEqual(list(zip()), lzip())
885 self.assertRaises(TypeError, zip, 3)
886 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000887 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000888 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000889 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000890 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700891
892 @support.impl_detail("tuple reuse is specific to CPython")
893 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000894 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000895 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000896 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000897 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000898
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000899 # check copy, deepcopy, pickle
900 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
901 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
902
903 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
904 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
905
Serhiy Storchakabad12572014-12-15 14:03:42 +0200906 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
907 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count()), proto))]
908 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000909
Serhiy Storchakabad12572014-12-15 14:03:42 +0200910 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
911 testIntermediate = zip('abc',count())
912 next(testIntermediate)
913 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate, proto))]
914 self.assertEqual(ans, [('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000915
Serhiy Storchakabad12572014-12-15 14:03:42 +0200916 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
917 self.pickletest(proto, zip('abc', count()))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000918
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000919 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000920 for args in [
921 ['abc', range(6)],
922 [range(6), 'abc'],
923 [range(1000), range(2000,2100), range(3000,3050)],
924 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
925 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
926 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000927 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
928 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000929 self.assertEqual(list(zip_longest(*args)), target)
930 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000931 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 +0000932 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000933
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000934 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 +0000935
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000936 self.assertEqual(list(zip_longest()), list(zip()))
937 self.assertEqual(list(zip_longest([])), list(zip([])))
938 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000940 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000941 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000942 self.assertRaises(TypeError, zip_longest, 3)
943 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000944
945 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000946 "zip_longest('abc', fv=1)",
947 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000948 ]:
949 try:
950 eval(stmt, globals(), locals())
951 except TypeError:
952 pass
953 else:
954 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000955
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000956 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000957 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000958 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000959 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700960
961 @support.impl_detail("tuple reuse is specific to CPython")
962 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000963 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000964 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000965 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000966 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
967
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000968 def test_zip_longest_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200969 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
970 self.pickletest(proto, zip_longest("abc", "def"))
971 self.pickletest(proto, zip_longest("abc", "defgh"))
972 self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
973 self.pickletest(proto, zip_longest("", "defgh"))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000974
Miss Islington (bot)27f41862019-08-29 23:23:17 -0700975 def test_zip_longest_bad_iterable(self):
976 exception = TypeError()
977
978 class BadIterable:
979 def __iter__(self):
980 raise exception
981
982 with self.assertRaises(TypeError) as cm:
983 zip_longest(BadIterable())
984
985 self.assertIs(cm.exception, exception)
986
Raymond Hettingerfc438512009-11-01 20:55:33 +0000987 def test_bug_7244(self):
988
989 class Repeater:
990 # this class is similar to itertools.repeat
991 def __init__(self, o, t, e):
992 self.o = o
993 self.t = int(t)
994 self.e = e
995 def __iter__(self): # its iterator is itself
996 return self
997 def __next__(self):
998 if self.t > 0:
999 self.t -= 1
1000 return self.o
1001 else:
1002 raise self.e
1003
1004 # Formerly this code in would fail in debug mode
1005 # with Undetected Error and Stop Iteration
1006 r1 = Repeater(1, 3, StopIteration)
1007 r2 = Repeater(2, 4, StopIteration)
1008 def run(r1, r2):
1009 result = []
1010 for i, j in zip_longest(r1, r2, fillvalue=0):
1011 with support.captured_output('stdout'):
1012 print((i, j))
1013 result.append((i, j))
1014 return result
1015 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
1016
1017 # Formerly, the RuntimeError would be lost
1018 # and StopIteration would stop as expected
1019 r1 = Repeater(1, 3, RuntimeError)
1020 r2 = Repeater(2, 4, StopIteration)
1021 it = zip_longest(r1, r2, fillvalue=0)
1022 self.assertEqual(next(it), (1, 2))
1023 self.assertEqual(next(it), (1, 2))
1024 self.assertEqual(next(it), (1, 2))
1025 self.assertRaises(RuntimeError, next, it)
1026
Christian Heimesc3f30c42008-02-22 16:37:40 +00001027 def test_product(self):
1028 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +00001029 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +00001030 (['ab'], [('a',), ('b',)]), # one iterable
1031 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
1032 ([range(0), range(2), range(3)], []), # first iterable with zero length
1033 ([range(2), range(0), range(3)], []), # middle iterable with zero length
1034 ([range(2), range(3), range(0)], []), # last iterable with zero length
1035 ]:
1036 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +00001037 for r in range(4):
1038 self.assertEqual(list(product(*(args*r))),
1039 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +00001040 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
1041 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001042
1043 def product1(*args, **kwds):
1044 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
1045 n = len(pools)
1046 if n == 0:
1047 yield ()
1048 return
1049 if any(len(pool) == 0 for pool in pools):
1050 return
1051 indices = [0] * n
1052 yield tuple(pool[i] for pool, i in zip(pools, indices))
1053 while 1:
1054 for i in reversed(range(n)): # right to left
1055 if indices[i] == len(pools[i]) - 1:
1056 continue
1057 indices[i] += 1
1058 for j in range(i+1, n):
1059 indices[j] = 0
1060 yield tuple(pool[i] for pool, i in zip(pools, indices))
1061 break
1062 else:
1063 return
1064
1065 def product2(*args, **kwds):
1066 'Pure python version used in docs'
1067 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
1068 result = [[]]
1069 for pool in pools:
1070 result = [x+[y] for x in result for y in pool]
1071 for prod in result:
1072 yield tuple(prod)
1073
Christian Heimesc3f30c42008-02-22 16:37:40 +00001074 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
1075 set('abcdefg'), range(11), tuple(range(13))]
1076 for i in range(100):
1077 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +00001078 expected_len = prod(map(len, args))
1079 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001080 self.assertEqual(list(product(*args)), list(product1(*args)))
1081 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +00001082 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +00001083 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001084
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001085 @support.bigaddrspacetest
1086 def test_product_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +02001087 with self.assertRaises((OverflowError, MemoryError)):
1088 product(*(['ab']*2**5), repeat=2**25)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001089
Alex Gaynore151d212011-07-17 16:21:30 -07001090 @support.impl_detail("tuple reuse is specific to CPython")
1091 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001092 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
1093 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001094
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001095 def test_product_pickling(self):
1096 # check copy, deepcopy, pickle
1097 for args, result in [
1098 ([], [()]), # zero iterables
1099 (['ab'], [('a',), ('b',)]), # one iterable
1100 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
1101 ([range(0), range(2), range(3)], []), # first iterable with zero length
1102 ([range(2), range(0), range(3)], []), # middle iterable with zero length
1103 ([range(2), range(3), range(0)], []), # last iterable with zero length
1104 ]:
1105 self.assertEqual(list(copy.copy(product(*args))), result)
1106 self.assertEqual(list(copy.deepcopy(product(*args))), result)
Serhiy Storchakabad12572014-12-15 14:03:42 +02001107 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1108 self.pickletest(proto, product(*args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001109
Kristján Valur Jónsson102764a2015-09-12 15:20:54 +00001110 def test_product_issue_25021(self):
1111 # test that indices are properly clamped to the length of the tuples
1112 p = product((1, 2),(3,))
1113 p.__setstate__((0, 0x1000)) # will access tuple element 1 if not clamped
1114 self.assertEqual(next(p), (2, 3))
1115 # test that empty tuple in the list will result in an immediate StopIteration
1116 p = product((1, 2), (), (3,))
1117 p.__setstate__((0, 0, 0x1000)) # will access tuple element 1 if not clamped
1118 self.assertRaises(StopIteration, next, p)
1119
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001120 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +00001121 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +00001122 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001123 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +00001124 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +00001125 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001126 self.assertEqual(list(repeat('a', 0)), [])
1127 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001128 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001129 self.assertRaises(TypeError, repeat, None, 3, 4)
1130 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001131 r = repeat(1+0j)
1132 self.assertEqual(repr(r), 'repeat((1+0j))')
1133 r = repeat(1+0j, 5)
1134 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
1135 list(r)
1136 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001137
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001138 # check copy, deepcopy, pickle
1139 c = repeat(object='a', times=10)
1140 self.assertEqual(next(c), 'a')
1141 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
1142 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001143 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1144 self.pickletest(proto, repeat(object='a', times=10))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001145
Raymond Hettinger97d35552014-06-24 21:36:58 -07001146 def test_repeat_with_negative_times(self):
1147 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
1148 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
1149 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
1150 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
1151
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001152 def test_map(self):
1153 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001154 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001155 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001156 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001157 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001158 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001159 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001160 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001161 self.assertEqual(list(map(operator.pow, [])), [])
1162 self.assertRaises(TypeError, map)
1163 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
1164 self.assertRaises(TypeError, map, operator.neg)
1165 self.assertRaises(TypeError, next, map(10, range(5)))
1166 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
1167 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001168
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001169 # check copy, deepcopy, pickle
1170 ans = [('a',0),('b',1),('c',2)]
1171
1172 c = map(tupleize, 'abc', count())
1173 self.assertEqual(list(copy.copy(c)), ans)
1174
1175 c = map(tupleize, 'abc', count())
1176 self.assertEqual(list(copy.deepcopy(c)), ans)
1177
Serhiy Storchakabad12572014-12-15 14:03:42 +02001178 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1179 c = map(tupleize, 'abc', count())
1180 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001181
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001182 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001183 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1184 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001185 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001186 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001187 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001188 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1189 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001190 self.assertRaises(TypeError, starmap)
1191 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001192 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1193 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1194 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001195
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001196 # check copy, deepcopy, pickle
1197 ans = [0**1, 1**2, 2**3]
1198
1199 c = starmap(operator.pow, zip(range(3), range(1,7)))
1200 self.assertEqual(list(copy.copy(c)), ans)
1201
1202 c = starmap(operator.pow, zip(range(3), range(1,7)))
1203 self.assertEqual(list(copy.deepcopy(c)), ans)
1204
Serhiy Storchakabad12572014-12-15 14:03:42 +02001205 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1206 c = starmap(operator.pow, zip(range(3), range(1,7)))
1207 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001208
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001209 def test_islice(self):
1210 for args in [ # islice(args) should agree with range(args)
1211 (10, 20, 3),
1212 (10, 3, 20),
1213 (10, 20),
Cheryl Sabellada1734c2018-03-26 21:29:33 -04001214 (10, 10),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001215 (10, 3),
1216 (20,)
1217 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001218 self.assertEqual(list(islice(range(100), *args)),
1219 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001220
1221 for args, tgtargs in [ # Stop when seqn is exhausted
1222 ((10, 110, 3), ((10, 100, 3))),
1223 ((10, 110), ((10, 100))),
1224 ((110,), (100,))
1225 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001226 self.assertEqual(list(islice(range(100), *args)),
1227 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001228
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001229 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001230 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1231 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1232 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1233 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1234 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001235
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001236 # Test number of items consumed SF #1171417
1237 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001238 self.assertEqual(list(islice(it, 3)), list(range(3)))
1239 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001240
Cheryl Sabellada1734c2018-03-26 21:29:33 -04001241 it = iter(range(10))
1242 self.assertEqual(list(islice(it, 3, 3)), [])
1243 self.assertEqual(list(it), list(range(3, 10)))
1244
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001245 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001246 ra = range(10)
1247 self.assertRaises(TypeError, islice, ra)
1248 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1249 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1250 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1251 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1252 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1253 self.assertRaises(ValueError, islice, ra, 'a')
1254 self.assertRaises(ValueError, islice, ra, 'a', 1)
1255 self.assertRaises(ValueError, islice, ra, 1, 'a')
1256 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1257 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001258 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001259
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001260 # Issue #10323: Less islice in a predictable state
1261 c = count()
1262 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1263 self.assertEqual(next(c), 3)
1264
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001265 # check copy, deepcopy, pickle
1266 for args in [ # islice(args) should agree with range(args)
1267 (10, 20, 3),
1268 (10, 3, 20),
1269 (10, 20),
1270 (10, 3),
1271 (20,)
1272 ]:
1273 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1274 list(range(*args)))
1275 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1276 list(range(*args)))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001277 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1278 self.pickletest(proto, islice(range(100), *args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001279
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001280 # Issue #21321: check source iterator is not referenced
1281 # from islice() after the latter has been exhausted
1282 it = (x for x in (1, 2))
1283 wr = weakref.ref(it)
1284 it = islice(it, 1)
1285 self.assertIsNotNone(wr())
1286 list(it) # exhaust the iterator
Benjamin Peterson8e163512014-08-24 18:07:28 -05001287 support.gc_collect()
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001288 self.assertIsNone(wr())
1289
Will Roberts0ecdc522017-06-08 08:03:04 +02001290 # Issue #30537: islice can accept integer-like objects as
1291 # arguments
1292 class IntLike(object):
1293 def __init__(self, val):
1294 self.val = val
1295 def __index__(self):
1296 return self.val
1297 self.assertEqual(list(islice(range(100), IntLike(10))), list(range(10)))
1298 self.assertEqual(list(islice(range(100), IntLike(10), IntLike(50))),
1299 list(range(10, 50)))
1300 self.assertEqual(list(islice(range(100), IntLike(10), IntLike(50), IntLike(5))),
1301 list(range(10,50,5)))
1302
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001303 def test_takewhile(self):
1304 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001305 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001306 self.assertEqual(list(takewhile(underten, [])), [])
1307 self.assertRaises(TypeError, takewhile)
1308 self.assertRaises(TypeError, takewhile, operator.pow)
1309 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001310 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1311 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001312 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1313 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001314 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001315
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001316 # check copy, deepcopy, pickle
1317 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1318 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1319 [1, 3, 5])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001320 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1321 self.pickletest(proto, takewhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001322
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001323 def test_dropwhile(self):
1324 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001325 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001326 self.assertEqual(list(dropwhile(underten, [])), [])
1327 self.assertRaises(TypeError, dropwhile)
1328 self.assertRaises(TypeError, dropwhile, operator.pow)
1329 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001330 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1331 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001332
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001333 # check copy, deepcopy, pickle
1334 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1335 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1336 [20, 2, 4, 6, 8])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001337 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1338 self.pickletest(proto, dropwhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001339
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001340 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001341 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001342
1343 a, b = tee([]) # test empty iterator
1344 self.assertEqual(list(a), [])
1345 self.assertEqual(list(b), [])
1346
1347 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001348 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001349
1350 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001351 self.assertEqual(list(a), list(range(n)))
1352 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001353
1354 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001355 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001356 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001357 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001358 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001359
1360 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001361 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001362 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001363 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001364 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001365
Guido van Rossum805365e2007-05-07 22:24:25 +00001366 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001367 order = [0]*n + [1]*n
1368 random.shuffle(order)
1369 lists = ([], [])
1370 its = tee(irange(n))
1371 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001372 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001373 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001374 self.assertEqual(lists[0], list(range(n)))
1375 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001376
Raymond Hettingerad983e72003-11-12 14:32:26 +00001377 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001378 self.assertRaises(TypeError, tee)
1379 self.assertRaises(TypeError, tee, 3)
1380 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001381 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001382
Raymond Hettingerad983e72003-11-12 14:32:26 +00001383 # tee object should be instantiable
1384 a, b = tee('abc')
1385 c = type(a)('def')
1386 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001387
Raymond Hettingerad983e72003-11-12 14:32:26 +00001388 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001389 a, b, c = tee(range(2000), 3)
1390 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001391 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001392 self.assertEqual(list(b), list(range(2000)))
1393 self.assertEqual([next(c), next(c)], list(range(2)))
1394 self.assertEqual(list(a), list(range(100,2000)))
1395 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001396
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001397 # test values of n
1398 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001400 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001401 result = tee('abc', n)
1402 self.assertEqual(type(result), tuple)
1403 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001404 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001405
Raymond Hettingerad983e72003-11-12 14:32:26 +00001406 # tee pass-through to copyable iterator
1407 a, b = tee('abc')
1408 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001409 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001410
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001411 # test tee_new
1412 t1, t2 = tee('abc')
1413 tnew = type(t1)
1414 self.assertRaises(TypeError, tnew)
1415 self.assertRaises(TypeError, tnew, 10)
1416 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001417 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001418
Raymond Hettingera9f60922004-10-17 16:40:14 +00001419 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001420 a, b = tee(range(10))
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001421 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +00001422 self.assertEqual(getattr(p, '__class__'), type(b))
1423 del a
1424 self.assertRaises(ReferenceError, getattr, p, '__class__')
1425
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001426 ans = list('abc')
1427 long_ans = list(range(10000))
1428
1429 # check copy
1430 a, b = tee('abc')
1431 self.assertEqual(list(copy.copy(a)), ans)
1432 self.assertEqual(list(copy.copy(b)), ans)
1433 a, b = tee(list(range(10000)))
1434 self.assertEqual(list(copy.copy(a)), long_ans)
1435 self.assertEqual(list(copy.copy(b)), long_ans)
1436
1437 # check partially consumed copy
1438 a, b = tee('abc')
1439 take(2, a)
1440 take(1, b)
1441 self.assertEqual(list(copy.copy(a)), ans[2:])
1442 self.assertEqual(list(copy.copy(b)), ans[1:])
1443 self.assertEqual(list(a), ans[2:])
1444 self.assertEqual(list(b), ans[1:])
1445 a, b = tee(range(10000))
1446 take(100, a)
1447 take(60, b)
1448 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1449 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1450 self.assertEqual(list(a), long_ans[100:])
1451 self.assertEqual(list(b), long_ans[60:])
1452
1453 # check deepcopy
1454 a, b = tee('abc')
1455 self.assertEqual(list(copy.deepcopy(a)), ans)
1456 self.assertEqual(list(copy.deepcopy(b)), ans)
1457 self.assertEqual(list(a), ans)
1458 self.assertEqual(list(b), ans)
1459 a, b = tee(range(10000))
1460 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1461 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1462 self.assertEqual(list(a), long_ans)
1463 self.assertEqual(list(b), long_ans)
1464
1465 # check partially consumed deepcopy
1466 a, b = tee('abc')
1467 take(2, a)
1468 take(1, b)
1469 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1470 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1471 self.assertEqual(list(a), ans[2:])
1472 self.assertEqual(list(b), ans[1:])
1473 a, b = tee(range(10000))
1474 take(100, a)
1475 take(60, b)
1476 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1477 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1478 self.assertEqual(list(a), long_ans[100:])
1479 self.assertEqual(list(b), long_ans[60:])
1480
1481 # check pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +02001482 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1483 self.pickletest(proto, iter(tee('abc')))
1484 a, b = tee('abc')
1485 self.pickletest(proto, a, compare=ans)
1486 self.pickletest(proto, b, compare=ans)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001487
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001488 # Issue 13454: Crash when deleting backward iterator from tee()
1489 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001490 forward, backward = tee(repeat(None, 20000000))
Serhiy Storchaka9db55002015-03-28 20:38:37 +02001491 try:
1492 any(forward) # exhaust the iterator
1493 del backward
1494 except:
1495 del forward, backward
1496 raise
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001497
Miss Islington (bot)6e3809c2019-09-09 02:07:51 -07001498 def test_tee_reenter(self):
1499 class I:
1500 first = True
1501 def __iter__(self):
1502 return self
1503 def __next__(self):
1504 first = self.first
1505 self.first = False
1506 if first:
1507 return next(b)
1508
1509 a, b = tee(I())
1510 with self.assertRaisesRegex(RuntimeError, "tee"):
1511 next(a)
1512
1513 def test_tee_concurrent(self):
1514 start = threading.Event()
1515 finish = threading.Event()
1516 class I:
1517 def __iter__(self):
1518 return self
1519 def __next__(self):
1520 start.set()
1521 finish.wait()
1522
1523 a, b = tee(I())
1524 thread = threading.Thread(target=next, args=[a])
1525 thread.start()
1526 try:
1527 start.wait()
1528 with self.assertRaisesRegex(RuntimeError, "tee"):
1529 next(b)
1530 finally:
1531 finish.set()
1532 thread.join()
1533
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001534 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001535 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001536
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001537 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001538 self.assertRaises(StopIteration, next, f([]))
1539 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001540
Georg Brandla18af4e2007-04-21 15:47:16 +00001541 self.assertRaises(StopIteration, next, islice([], None))
1542 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001543
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001544 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001545 self.assertRaises(StopIteration, next, p)
1546 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001547 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001548 self.assertRaises(StopIteration, next, p)
1549 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001550
Georg Brandla18af4e2007-04-21 15:47:16 +00001551 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001552
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001553 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001554 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1555 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001556
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001557class TestExamples(unittest.TestCase):
1558
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001559 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001560 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1561
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001562 def test_accumulate_reducible(self):
1563 # check copy, deepcopy, pickle
1564 data = [1, 2, 3, 4, 5]
1565 accumulated = [1, 3, 6, 10, 15]
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001566
Serhiy Storchakabad12572014-12-15 14:03:42 +02001567 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1568 it = accumulate(data)
1569 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[:])
1570 self.assertEqual(next(it), 1)
1571 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[1:])
1572 it = accumulate(data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001573 self.assertEqual(next(it), 1)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001574 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1575 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1576
Serhiy Storchakad5516252016-03-06 14:00:45 +02001577 def test_accumulate_reducible_none(self):
1578 # Issue #25718: total is None
1579 it = accumulate([None, None, None], operator.is_)
1580 self.assertEqual(next(it), None)
1581 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1582 it_copy = pickle.loads(pickle.dumps(it, proto))
1583 self.assertEqual(list(it_copy), [True, False])
1584 self.assertEqual(list(copy.deepcopy(it)), [True, False])
1585 self.assertEqual(list(copy.copy(it)), [True, False])
1586
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001587 def test_chain(self):
1588 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1589
1590 def test_chain_from_iterable(self):
1591 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1592
1593 def test_combinations(self):
1594 self.assertEqual(list(combinations('ABCD', 2)),
1595 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1596 self.assertEqual(list(combinations(range(4), 3)),
1597 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1598
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001599 def test_combinations_with_replacement(self):
1600 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1601 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1602
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001603 def test_compress(self):
1604 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1605
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001606 def test_count(self):
1607 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1608
1609 def test_cycle(self):
1610 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1611
1612 def test_dropwhile(self):
1613 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1614
1615 def test_groupby(self):
1616 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1617 list('ABCDAB'))
1618 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1619 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1620
1621 def test_filter(self):
1622 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1623
1624 def test_filterfalse(self):
1625 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1626
1627 def test_map(self):
1628 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1629
1630 def test_islice(self):
1631 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1632 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1633 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1634 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1635
1636 def test_zip(self):
1637 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1638
1639 def test_zip_longest(self):
1640 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1641 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1642
1643 def test_permutations(self):
1644 self.assertEqual(list(permutations('ABCD', 2)),
1645 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1646 self.assertEqual(list(permutations(range(3))),
1647 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1648
1649 def test_product(self):
1650 self.assertEqual(list(product('ABCD', 'xy')),
1651 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1652 self.assertEqual(list(product(range(2), repeat=3)),
1653 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1654 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1655
1656 def test_repeat(self):
1657 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1658
1659 def test_stapmap(self):
1660 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1661 [32, 9, 1000])
1662
1663 def test_takewhile(self):
1664 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1665
1666
Cheryl Sabellada1734c2018-03-26 21:29:33 -04001667class TestPurePythonRoughEquivalents(unittest.TestCase):
1668
1669 @staticmethod
1670 def islice(iterable, *args):
1671 s = slice(*args)
1672 start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
1673 it = iter(range(start, stop, step))
1674 try:
1675 nexti = next(it)
1676 except StopIteration:
1677 # Consume *iterable* up to the *start* position.
1678 for i, element in zip(range(start), iterable):
1679 pass
1680 return
1681 try:
1682 for i, element in enumerate(iterable):
1683 if i == nexti:
1684 yield element
1685 nexti = next(it)
1686 except StopIteration:
1687 # Consume to *stop*.
1688 for i, element in zip(range(i + 1, stop), iterable):
1689 pass
1690
1691 def test_islice_recipe(self):
1692 self.assertEqual(list(self.islice('ABCDEFG', 2)), list('AB'))
1693 self.assertEqual(list(self.islice('ABCDEFG', 2, 4)), list('CD'))
1694 self.assertEqual(list(self.islice('ABCDEFG', 2, None)), list('CDEFG'))
1695 self.assertEqual(list(self.islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1696 # Test items consumed.
1697 it = iter(range(10))
1698 self.assertEqual(list(self.islice(it, 3)), list(range(3)))
1699 self.assertEqual(list(it), list(range(3, 10)))
1700 it = iter(range(10))
1701 self.assertEqual(list(self.islice(it, 3, 3)), [])
1702 self.assertEqual(list(it), list(range(3, 10)))
1703 # Test that slice finishes in predictable state.
1704 c = count()
1705 self.assertEqual(list(self.islice(c, 1, 3, 50)), [1])
1706 self.assertEqual(next(c), 3)
1707
1708
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001709class TestGC(unittest.TestCase):
1710
1711 def makecycle(self, iterator, container):
1712 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001713 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001714 del container, iterator
1715
Raymond Hettinger482ba772010-12-01 22:48:00 +00001716 def test_accumulate(self):
1717 a = []
1718 self.makecycle(accumulate([1,2,a,3]), a)
1719
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001720 def test_chain(self):
1721 a = []
1722 self.makecycle(chain(a), a)
1723
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001724 def test_chain_from_iterable(self):
1725 a = []
1726 self.makecycle(chain.from_iterable([a]), a)
1727
1728 def test_combinations(self):
1729 a = []
1730 self.makecycle(combinations([1,2,a,3], 3), a)
1731
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001732 def test_combinations_with_replacement(self):
1733 a = []
1734 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1735
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001736 def test_compress(self):
1737 a = []
1738 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1739
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001740 def test_count(self):
1741 a = []
1742 Int = type('Int', (int,), dict(x=a))
1743 self.makecycle(count(Int(0), Int(1)), a)
1744
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001745 def test_cycle(self):
1746 a = []
1747 self.makecycle(cycle([a]*2), a)
1748
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001749 def test_dropwhile(self):
1750 a = []
1751 self.makecycle(dropwhile(bool, [0, a, a]), a)
1752
1753 def test_groupby(self):
1754 a = []
1755 self.makecycle(groupby([a]*2, lambda x:x), a)
1756
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001757 def test_issue2246(self):
1758 # Issue 2246 -- the _grouper iterator was not included in GC
1759 n = 10
1760 keyfunc = lambda x: x
1761 for i, j in groupby(range(n), key=keyfunc):
1762 keyfunc.__dict__.setdefault('x',[]).append(j)
1763
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001764 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001765 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001766 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001767
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001768 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001769 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001770 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001771
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001772 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001773 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001774 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001775
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001776 def test_zip_longest(self):
1777 a = []
1778 self.makecycle(zip_longest([a]*2, [a]*3), a)
1779 b = [a, None]
1780 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1781
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001782 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001783 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001784 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001785
1786 def test_islice(self):
1787 a = []
1788 self.makecycle(islice([a]*2, None), a)
1789
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001790 def test_permutations(self):
1791 a = []
1792 self.makecycle(permutations([1,2,a,3], 3), a)
1793
1794 def test_product(self):
1795 a = []
1796 self.makecycle(product([1,2,a,3], repeat=3), a)
1797
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001798 def test_repeat(self):
1799 a = []
1800 self.makecycle(repeat(a), a)
1801
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001802 def test_starmap(self):
1803 a = []
1804 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1805
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001806 def test_takewhile(self):
1807 a = []
1808 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1809
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001810def R(seqn):
1811 'Regular generator'
1812 for i in seqn:
1813 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001814
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001815class G:
1816 'Sequence using __getitem__'
1817 def __init__(self, seqn):
1818 self.seqn = seqn
1819 def __getitem__(self, i):
1820 return self.seqn[i]
1821
1822class I:
1823 'Sequence using iterator protocol'
1824 def __init__(self, seqn):
1825 self.seqn = seqn
1826 self.i = 0
1827 def __iter__(self):
1828 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001829 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001830 if self.i >= len(self.seqn): raise StopIteration
1831 v = self.seqn[self.i]
1832 self.i += 1
1833 return v
1834
1835class Ig:
1836 'Sequence using iterator protocol defined with a generator'
1837 def __init__(self, seqn):
1838 self.seqn = seqn
1839 self.i = 0
1840 def __iter__(self):
1841 for val in self.seqn:
1842 yield val
1843
1844class X:
1845 'Missing __getitem__ and __iter__'
1846 def __init__(self, seqn):
1847 self.seqn = seqn
1848 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001849 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001850 if self.i >= len(self.seqn): raise StopIteration
1851 v = self.seqn[self.i]
1852 self.i += 1
1853 return v
1854
1855class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001856 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001857 def __init__(self, seqn):
1858 self.seqn = seqn
1859 self.i = 0
1860 def __iter__(self):
1861 return self
1862
1863class E:
1864 'Test propagation of exceptions'
1865 def __init__(self, seqn):
1866 self.seqn = seqn
1867 self.i = 0
1868 def __iter__(self):
1869 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001870 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001871 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001872
1873class S:
1874 'Test immediate stop'
1875 def __init__(self, seqn):
1876 pass
1877 def __iter__(self):
1878 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001879 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001880 raise StopIteration
1881
1882def L(seqn):
1883 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001884 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001885
1886
1887class TestVariousIteratorArgs(unittest.TestCase):
1888
Raymond Hettinger482ba772010-12-01 22:48:00 +00001889 def test_accumulate(self):
1890 s = [1,2,3,4,5]
1891 r = [1,3,6,10,15]
1892 n = len(s)
1893 for g in (G, I, Ig, L, R):
1894 self.assertEqual(list(accumulate(g(s))), r)
1895 self.assertEqual(list(accumulate(S(s))), [])
1896 self.assertRaises(TypeError, accumulate, X(s))
1897 self.assertRaises(TypeError, accumulate, N(s))
1898 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1899
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001900 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001901 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001902 for g in (G, I, Ig, S, L, R):
1903 self.assertEqual(list(chain(g(s))), list(g(s)))
1904 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001905 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001906 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001907 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1908
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001909 def test_compress(self):
1910 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1911 n = len(s)
1912 for g in (G, I, Ig, S, L, R):
1913 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1914 self.assertRaises(TypeError, compress, X(s), repeat(1))
1915 self.assertRaises(TypeError, compress, N(s), repeat(1))
1916 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1917
Christian Heimesc3f30c42008-02-22 16:37:40 +00001918 def test_product(self):
1919 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1920 self.assertRaises(TypeError, product, X(s))
1921 self.assertRaises(TypeError, product, N(s))
1922 self.assertRaises(ZeroDivisionError, product, E(s))
1923
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001924 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001925 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001926 for g in (G, I, Ig, S, L, R):
1927 tgtlen = len(s) * 3
1928 expected = list(g(s))*3
1929 actual = list(islice(cycle(g(s)), tgtlen))
1930 self.assertEqual(actual, expected)
1931 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001932 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001933 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1934
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001935 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001936 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001937 for g in (G, I, Ig, S, L, R):
1938 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1939 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001940 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001941 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1942
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001943 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001944 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001945 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001946 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001947 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001948 self.assertRaises(TypeError, filter, isEven, X(s))
1949 self.assertRaises(TypeError, filter, isEven, N(s))
1950 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001951
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001952 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001953 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001954 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001955 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001956 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001957 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1958 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1959 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001960
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001961 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001962 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001963 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001964 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1965 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1966 self.assertRaises(TypeError, zip, X(s))
1967 self.assertRaises(TypeError, zip, N(s))
1968 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001969
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001970 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001971 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001972 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001973 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1974 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1975 self.assertRaises(TypeError, zip_longest, X(s))
1976 self.assertRaises(TypeError, zip_longest, N(s))
1977 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001978
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001979 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001980 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001981 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001982 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001983 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001984 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001985 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001986 self.assertRaises(TypeError, map, onearg, X(s))
1987 self.assertRaises(TypeError, map, onearg, N(s))
1988 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001989
1990 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001991 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001992 for g in (G, I, Ig, S, L, R):
1993 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1994 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001995 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001996 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1997
1998 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001999 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002000 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00002001 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002002 self.assertEqual(list(starmap(operator.pow, g(ss))),
2003 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002004 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00002005 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002006 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
2007
2008 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002009 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002010 for g in (G, I, Ig, S, L, R):
2011 tgt = []
2012 for elem in g(s):
2013 if not isEven(elem): break
2014 tgt.append(elem)
2015 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
2016 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00002017 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002018 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
2019
2020 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002021 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002022 for g in (G, I, Ig, S, L, R):
2023 tgt = []
2024 for elem in g(s):
2025 if not tgt and isOdd(elem): continue
2026 tgt.append(elem)
2027 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
2028 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00002029 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002030 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
2031
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002032 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002033 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002034 for g in (G, I, Ig, S, L, R):
2035 it1, it2 = tee(g(s))
2036 self.assertEqual(list(it1), list(g(s)))
2037 self.assertEqual(list(it2), list(g(s)))
2038 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00002039 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002040 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
2041
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00002042class LengthTransparency(unittest.TestCase):
2043
2044 def test_repeat(self):
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02002045 self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
Raymond Hettinger97d35552014-06-24 21:36:58 -07002046 self.assertEqual(operator.length_hint(repeat(None, 0)), 0)
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02002047 self.assertEqual(operator.length_hint(repeat(None), 12), 12)
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00002048
Raymond Hettinger97d35552014-06-24 21:36:58 -07002049 def test_repeat_with_negative_times(self):
2050 self.assertEqual(operator.length_hint(repeat(None, -1)), 0)
2051 self.assertEqual(operator.length_hint(repeat(None, -2)), 0)
2052 self.assertEqual(operator.length_hint(repeat(None, times=-1)), 0)
2053 self.assertEqual(operator.length_hint(repeat(None, times=-2)), 0)
2054
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002055class RegressionTests(unittest.TestCase):
2056
2057 def test_sf_793826(self):
2058 # Fix Armin Rigo's successful efforts to wreak havoc
2059
2060 def mutatingtuple(tuple1, f, tuple2):
2061 # this builds a tuple t which is a copy of tuple1,
2062 # then calls f(t), then mutates t to be equal to tuple2
2063 # (needs len(tuple1) == len(tuple2)).
2064 def g(value, first=[1]):
2065 if first:
2066 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00002067 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002068 return value
2069 items = list(tuple2)
2070 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002071 gen = map(g, items)
2072 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00002073 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002074
2075 def f(t):
2076 global T
2077 T = t
2078 first[:] = list(T)
2079
2080 first = []
2081 mutatingtuple((1,2,3), f, (4,5,6))
2082 second = list(T)
2083 self.assertEqual(first, second)
2084
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002085
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00002086 def test_sf_950057(self):
2087 # Make sure that chain() and cycle() catch exceptions immediately
2088 # rather than when shifting between input sources
2089
2090 def gen1():
2091 hist.append(0)
2092 yield 1
2093 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00002094 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00002095 hist.append(2)
2096
2097 def gen2(x):
2098 hist.append(3)
2099 yield 2
2100 hist.append(4)
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00002101
2102 hist = []
2103 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
2104 self.assertEqual(hist, [0,1])
2105
2106 hist = []
2107 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
2108 self.assertEqual(hist, [0,1])
2109
2110 hist = []
2111 self.assertRaises(AssertionError, list, cycle(gen1()))
2112 self.assertEqual(hist, [0,1])
2113
Miss Islington (bot)382cb852019-07-30 11:34:33 -07002114 @support.skip_if_pgo_task
T. Wouters5466d4a2017-03-30 09:58:35 -07002115 def test_long_chain_of_empty_iterables(self):
2116 # Make sure itertools.chain doesn't run into recursion limits when
2117 # dealing with long chains of empty iterables. Even with a high
2118 # number this would probably only fail in Py_DEBUG mode.
2119 it = chain.from_iterable(() for unused in range(10000000))
2120 with self.assertRaises(StopIteration):
2121 next(it)
2122
Serhiy Storchakac740e4f2017-09-26 21:47:56 +03002123 def test_issue30347_1(self):
2124 def f(n):
2125 if n == 5:
2126 list(b)
2127 return n != 6
2128 for (k, b) in groupby(range(10), f):
2129 list(b) # shouldn't crash
2130
2131 def test_issue30347_2(self):
2132 class K:
2133 def __init__(self, v):
2134 pass
2135 def __eq__(self, other):
2136 nonlocal i
2137 i += 1
2138 if i == 1:
2139 next(g, None)
2140 return True
2141 i = 0
2142 g = next(groupby(range(10), K))[1]
2143 for j in range(2):
2144 next(g, None) # shouldn't crash
2145
2146
Thomas Woutersb2137042007-02-01 18:02:27 +00002147class SubclassWithKwargsTest(unittest.TestCase):
2148 def test_keywords_in_subclass(self):
2149 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002150 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00002151 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00002152 class Subclass(cls):
2153 def __init__(self, newarg=None, *args):
2154 cls.__init__(self, *args)
2155 try:
2156 Subclass(newarg=1)
2157 except TypeError as err:
2158 # we expect type errors because of wrong argument count
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +03002159 self.assertNotIn("keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00002160
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002161@support.cpython_only
2162class SizeofTest(unittest.TestCase):
2163 def setUp(self):
2164 self.ssize_t = struct.calcsize('n')
2165
2166 check_sizeof = support.check_sizeof
2167
2168 def test_product_sizeof(self):
2169 basesize = support.calcobjsize('3Pi')
2170 check = self.check_sizeof
2171 check(product('ab', '12'), basesize + 2 * self.ssize_t)
2172 check(product(*(('abc',) * 10)), basesize + 10 * self.ssize_t)
2173
2174 def test_combinations_sizeof(self):
2175 basesize = support.calcobjsize('3Pni')
2176 check = self.check_sizeof
2177 check(combinations('abcd', 3), basesize + 3 * self.ssize_t)
2178 check(combinations(range(10), 4), basesize + 4 * self.ssize_t)
2179
2180 def test_combinations_with_replacement_sizeof(self):
2181 cwr = combinations_with_replacement
2182 basesize = support.calcobjsize('3Pni')
2183 check = self.check_sizeof
2184 check(cwr('abcd', 3), basesize + 3 * self.ssize_t)
2185 check(cwr(range(10), 4), basesize + 4 * self.ssize_t)
2186
2187 def test_permutations_sizeof(self):
2188 basesize = support.calcobjsize('4Pni')
2189 check = self.check_sizeof
2190 check(permutations('abcd'),
2191 basesize + 4 * self.ssize_t + 4 * self.ssize_t)
2192 check(permutations('abcd', 3),
2193 basesize + 4 * self.ssize_t + 3 * self.ssize_t)
2194 check(permutations('abcde', 3),
2195 basesize + 5 * self.ssize_t + 3 * self.ssize_t)
2196 check(permutations(range(10), 4),
2197 basesize + 10 * self.ssize_t + 4 * self.ssize_t)
2198
Thomas Woutersb2137042007-02-01 18:02:27 +00002199
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00002200libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002201
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002202
2203>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002204>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00002205... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002206...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002207Check 1200 is for $120.15
2208Check 1201 is for $764.05
2209Check 1202 is for $823.14
2210
2211>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002212>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00002213... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002214...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000022151
22168
221727
2218
2219>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00002220>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00002221... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00002222...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002223Alex
2224Laura
2225Martin
2226Walter
2227Samuele
2228
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002229>>> from operator import itemgetter
2230>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002231>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002232>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002233... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002234...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000022351 ['a', 'c', 'e']
22362 ['b', 'd', 'f']
22373 ['g']
2238
Raymond Hettinger734fb572004-01-20 20:04:40 +00002239# Find runs of consecutive numbers using groupby. The key to the solution
2240# is differencing with a range so that consecutive numbers all appear in
2241# same group.
2242>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002243>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002244... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002245...
Raymond Hettinger734fb572004-01-20 20:04:40 +00002246[1]
2247[4, 5, 6]
2248[10]
2249[15, 16, 17, 18]
2250[22]
2251[25, 26, 27, 28]
2252
Georg Brandl3dbca812008-07-23 16:10:53 +00002253>>> def take(n, iterable):
2254... "Return first n items of the iterable as a list"
2255... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00002256
Raymond Hettinger9265dd72018-04-08 08:44:20 -07002257>>> def prepend(value, iterator):
2258... "Prepend a single value in front of an iterator"
2259... # prepend(1, [2, 3, 4]) -> 1 2 3 4
2260... return chain([value], iterator)
2261
Georg Brandl3dbca812008-07-23 16:10:53 +00002262>>> def enumerate(iterable, start=0):
2263... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002264
Georg Brandl3dbca812008-07-23 16:10:53 +00002265>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002266... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00002267... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002268
Cheryl Sabellada1734c2018-03-26 21:29:33 -04002269>>> import collections
2270>>> def consume(iterator, n=None):
2271... "Advance the iterator n-steps ahead. If n is None, consume entirely."
2272... # Use functions that consume iterators at C speed.
2273... if n is None:
2274... # feed the entire iterator into a zero-length deque
2275... collections.deque(iterator, maxlen=0)
2276... else:
2277... # advance to the empty slice starting at position n
2278... next(islice(iterator, n, n), None)
2279
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00002280>>> def nth(iterable, n, default=None):
2281... "Returns the nth item or a default value"
2282... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00002283
Raymond Hettingere525ee32016-03-06 18:11:38 -08002284>>> def all_equal(iterable):
2285... "Returns True if all the elements are equal to each other"
2286... g = groupby(iterable)
2287... return next(g, True) and not next(g, False)
2288
Georg Brandl3dbca812008-07-23 16:10:53 +00002289>>> def quantify(iterable, pred=bool):
2290... "Count how many times the predicate is true"
2291... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00002292
Georg Brandl3dbca812008-07-23 16:10:53 +00002293>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002294... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00002295... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002296
Georg Brandl3dbca812008-07-23 16:10:53 +00002297>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02002298... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00002299... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002300
2301>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002302... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002303
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002304>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002305... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002306
2307>>> def repeatfunc(func, times=None, *args):
2308... "Repeat calls to func with specified arguments."
2309... " Example: repeatfunc(random.random)"
2310... if times is None:
2311... return starmap(func, repeat(args))
2312... else:
2313... return starmap(func, repeat(args, times))
2314
Raymond Hettingerd591f662003-10-26 15:34:50 +00002315>>> def pairwise(iterable):
2316... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
2317... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002318... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00002319... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002320... except StopIteration:
2321... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002322... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002323
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002324>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002325... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002326... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00002327... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002328
2329>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002330... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002331... # Recipe credited to George Sakkis
2332... pending = len(iterables)
2333... nexts = cycle(iter(it).__next__ for it in iterables)
2334... while pending:
2335... try:
2336... for next in nexts:
2337... yield next()
2338... except StopIteration:
2339... pending -= 1
2340... nexts = cycle(islice(nexts, pending))
2341
2342>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00002343... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
2344... s = list(iterable)
2345... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002346
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002347>>> def unique_everseen(iterable, key=None):
2348... "List unique elements, preserving order. Remember all elements ever seen."
2349... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
2350... # unique_everseen('ABBCcAD', str.lower) --> A B C D
2351... seen = set()
2352... seen_add = seen.add
2353... if key is None:
2354... for element in iterable:
2355... if element not in seen:
2356... seen_add(element)
2357... yield element
2358... else:
2359... for element in iterable:
2360... k = key(element)
2361... if k not in seen:
2362... seen_add(k)
2363... yield element
2364
2365>>> def unique_justseen(iterable, key=None):
2366... "List unique elements, preserving order. Remember only the element just seen."
2367... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
2368... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
2369... return map(next, map(itemgetter(1), groupby(iterable, key)))
2370
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002371>>> def first_true(iterable, default=False, pred=None):
2372... '''Returns the first true value in the iterable.
2373...
2374... If no true value is found, returns *default*
2375...
2376... If *pred* is not None, returns the first item
2377... for which pred(item) is true.
2378...
2379... '''
2380... # first_true([a,b,c], x) --> a or b or c or x
2381... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
2382... return next(filter(pred, iterable), default)
2383
Raymond Hettingerd37258d2018-01-13 10:35:40 -08002384>>> def nth_combination(iterable, r, index):
2385... 'Equivalent to list(combinations(iterable, r))[index]'
2386... pool = tuple(iterable)
2387... n = len(pool)
2388... if r < 0 or r > n:
2389... raise ValueError
2390... c = 1
2391... k = min(r, n-r)
2392... for i in range(1, k+1):
2393... c = c * (n - k + i) // i
2394... if index < 0:
2395... index += c
2396... if index < 0 or index >= c:
2397... raise IndexError
2398... result = []
2399... while r:
2400... c, n, r = c*r//n, n-1, r-1
2401... while index >= c:
2402... index -= c
2403... c, n = c*(n-r)//n, n-1
2404... result.append(pool[-1-n])
2405... return tuple(result)
2406
2407
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002408This is not part of the examples but it tests to make sure the definitions
2409perform as purported.
2410
Raymond Hettingera098b332003-09-08 23:58:40 +00002411>>> take(10, count())
2412[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2413
Raymond Hettinger9265dd72018-04-08 08:44:20 -07002414>>> list(prepend(1, [2, 3, 4]))
2415[1, 2, 3, 4]
2416
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002417>>> list(enumerate('abc'))
2418[(0, 'a'), (1, 'b'), (2, 'c')]
2419
2420>>> list(islice(tabulate(lambda x: 2*x), 4))
2421[0, 2, 4, 6]
2422
Cheryl Sabellada1734c2018-03-26 21:29:33 -04002423>>> it = iter(range(10))
2424>>> consume(it, 3)
2425>>> next(it)
24263
2427>>> consume(it)
2428>>> next(it, 'Done')
2429'Done'
2430
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002431>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00002432'd'
2433
2434>>> nth('abcde', 9) is None
2435True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002436
Raymond Hettingere525ee32016-03-06 18:11:38 -08002437>>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')]
2438[True, True, True, False, False]
2439
Guido van Rossum805365e2007-05-07 22:24:25 +00002440>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000244150
2442
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002443>>> a = [[1, 2, 3], [4, 5, 6]]
2444>>> flatten(a)
2445[1, 2, 3, 4, 5, 6]
2446
2447>>> list(repeatfunc(pow, 5, 2, 3))
2448[8, 8, 8, 8, 8]
2449
2450>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002451>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002452[0, 0, 0, 0, 0]
2453
Raymond Hettingerd591f662003-10-26 15:34:50 +00002454>>> list(pairwise('abcd'))
2455[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002456
Raymond Hettingerd591f662003-10-26 15:34:50 +00002457>>> list(pairwise([]))
2458[]
2459
2460>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002461[]
2462
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002463>>> list(islice(padnone('abc'), 0, 6))
2464['a', 'b', 'c', None, None, None]
2465
2466>>> list(ncycles('abc', 3))
2467['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2468
2469>>> dotproduct([1,2,3], [4,5,6])
247032
2471
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002472>>> list(grouper(3, 'abcdefg', 'x'))
2473[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2474
2475>>> list(roundrobin('abc', 'd', 'ef'))
2476['a', 'd', 'e', 'b', 'f', 'c']
2477
Raymond Hettingerace67332009-01-26 02:23:50 +00002478>>> list(powerset([1,2,3]))
2479[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002480
Raymond Hettinger191e8502009-01-27 13:29:43 +00002481>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2482True
2483
2484>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2485True
2486
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002487>>> list(unique_everseen('AAAABBBCCDAABBB'))
2488['A', 'B', 'C', 'D']
2489
2490>>> list(unique_everseen('ABBCcAD', str.lower))
2491['A', 'B', 'C', 'D']
2492
2493>>> list(unique_justseen('AAAABBBCCDAABBB'))
2494['A', 'B', 'C', 'D', 'A', 'B']
2495
2496>>> list(unique_justseen('ABBCcAD', str.lower))
2497['A', 'B', 'C', 'A', 'D']
2498
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002499>>> first_true('ABC0DEF1', '9', str.isdigit)
2500'0'
2501
Raymond Hettingerd37258d2018-01-13 10:35:40 -08002502>>> population = 'ABCDEFGH'
2503>>> for r in range(len(population) + 1):
2504... seq = list(combinations(population, r))
2505... for i in range(len(seq)):
2506... assert nth_combination(population, r, i) == seq[i]
2507... for i in range(-len(seq), 0):
2508... assert nth_combination(population, r, i) == seq[i]
2509
2510
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002511"""
2512
2513__test__ = {'libreftest' : libreftest}
2514
2515def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002516 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002517 RegressionTests, LengthTransparency,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002518 SubclassWithKwargsTest, TestExamples,
Cheryl Sabellada1734c2018-03-26 21:29:33 -04002519 TestPurePythonRoughEquivalents,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002520 SizeofTest)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002521 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002522
2523 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002524 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002525 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002526 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002527 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002528 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002529 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002530 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002531 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002532
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002533 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002534 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002535
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002536if __name__ == "__main__":
2537 test_main(verbose=True)