blob: d44235bc77f0b84c983300db4f8368e11672b1e6 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Guido van Rossum360e4b82007-05-14 22:51:27 +00009maxsize = test_support.MAX_Py_ssize_t
10minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
Guido van Rossum801f0d72006-08-24 19:48:10 +000012def lzip(*args):
13 return list(zip(*args))
14
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015def onearg(x):
16 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000017 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000018
19def errfunc(*args):
20 'Test function that raises an error'
21 raise ValueError
22
23def gen3():
24 'Non-restartable source sequence'
25 for i in (0, 1, 2):
26 yield i
27
28def isEven(x):
29 'Test predicate'
30 return x%2==0
31
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000032def isOdd(x):
33 'Test predicate'
34 return x%2==1
35
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000036class StopNow:
37 'Class emulating an empty iterable.'
38 def __iter__(self):
39 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000040 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000041 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000042
Raymond Hettinger02420702003-06-29 20:36:23 +000043def take(n, seq):
44 'Convenience function for partially consuming a long of infinite iterable'
45 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000046
Christian Heimes78644762008-03-04 23:39:23 +000047def prod(iterable):
48 return reduce(operator.mul, iterable, 1)
49
Christian Heimes380f7f22008-02-28 11:19:05 +000050def fact(n):
51 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000052 return prod(range(1, n+1))
53
54def permutations(iterable, r=None):
55 # XXX use this until real permutations code is added
56 pool = tuple(iterable)
57 n = len(pool)
58 r = n if r is None else r
59 for indices in product(range(n), repeat=r):
60 if len(set(indices)) == r:
61 yield tuple(pool[i] for i in indices)
Christian Heimes380f7f22008-02-28 11:19:05 +000062
Raymond Hettinger96ef8112003-02-01 00:10:11 +000063class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000064 def test_chain(self):
65 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000066 self.assertEqual(list(chain('abc')), list('abc'))
67 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000068 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Christian Heimesf16baeb2008-02-29 14:57:44 +000069 self.assertRaises(TypeError, list,chain(2, 3))
70
71 def test_chain_from_iterable(self):
72 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
73 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
74 self.assertEqual(list(chain.from_iterable([''])), [])
75 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
76 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000077
Christian Heimes380f7f22008-02-28 11:19:05 +000078 def test_combinations(self):
79 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
80 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +000081 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +000082 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
83 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
84 self.assertEqual(list(combinations(range(4), 3)),
85 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +000086
87 def combinations1(iterable, r):
88 'Pure python version shown in the docs'
89 pool = tuple(iterable)
90 n = len(pool)
91 indices = list(range(r))
92 yield tuple(pool[i] for i in indices)
93 while 1:
94 for i in reversed(range(r)):
95 if indices[i] != i + n - r:
96 break
97 else:
98 return
99 indices[i] += 1
100 for j in range(i+1, r):
101 indices[j] = indices[j-1] + 1
102 yield tuple(pool[i] for i in indices)
103
104 def combinations2(iterable, r):
105 'Pure python version shown in the docs'
106 pool = tuple(iterable)
107 n = len(pool)
108 for indices in permutations(range(n), r):
109 if sorted(indices) == list(indices):
110 yield tuple(pool[i] for i in indices)
111
112 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000113 values = [5*x-12 for x in range(n)]
114 for r in range(n+1):
115 result = list(combinations(values, r))
116 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
117 self.assertEqual(len(result), len(set(result))) # no repeats
118 self.assertEqual(result, sorted(result)) # lexicographic order
119 for c in result:
120 self.assertEqual(len(c), r) # r-length combinations
121 self.assertEqual(len(set(c)), r) # no duplicate elements
122 self.assertEqual(list(c), sorted(c)) # keep original ordering
123 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000124 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
125 self.assertEqual(result, list(combinations2(values, r))) # matches first pure python version
126
127 # Test implementation detail: tuple re-use
128 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
129 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
130
131 def test_permutations(self):
132 self.assertRaises(TypeError, permutations) # too few arguments
133 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
134## self.assertRaises(TypeError, permutations, None) # pool is not iterable
135## self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
136## self.assertRaises(ValueError, permutations, 'abc', 32) # r is too big
137 self.assertEqual(list(permutations(range(3), 2)),
138 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
139
140 def permutations1(iterable, r=None):
141 'Pure python version shown in the docs'
142 pool = tuple(iterable)
143 n = len(pool)
144 r = n if r is None else r
145 indices = list(range(n))
146 cycles = list(range(n-r+1, n+1))[::-1]
147 yield tuple(pool[i] for i in indices[:r])
148 while n:
149 for i in reversed(range(r)):
150 cycles[i] -= 1
151 if cycles[i] == 0:
152 indices[i:] = indices[i+1:] + indices[i:i+1]
153 cycles[i] = n - i
154 else:
155 j = cycles[i]
156 indices[i], indices[-j] = indices[-j], indices[i]
157 yield tuple(pool[i] for i in indices[:r])
158 break
159 else:
160 return
161
162 def permutations2(iterable, r=None):
163 'Pure python version shown in the docs'
164 pool = tuple(iterable)
165 n = len(pool)
166 r = n if r is None else r
167 for indices in product(range(n), repeat=r):
168 if len(set(indices)) == r:
169 yield tuple(pool[i] for i in indices)
170
171 for n in range(7):
172 values = [5*x-12 for x in range(n)]
173 for r in range(n+1):
174 result = list(permutations(values, r))
175 self.assertEqual(len(result), fact(n) / fact(n-r)) # right number of perms
176 self.assertEqual(len(result), len(set(result))) # no repeats
177 self.assertEqual(result, sorted(result)) # lexicographic order
178 for p in result:
179 self.assertEqual(len(p), r) # r-length permutations
180 self.assertEqual(len(set(p)), r) # no duplicate elements
181 self.assert_(all(e in values for e in p)) # elements taken from input iterable
182 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
183 self.assertEqual(result, list(permutations2(values, r))) # matches first pure python version
184 if r == n:
185 self.assertEqual(result, list(permutations(values, None))) # test r as None
186 self.assertEqual(result, list(permutations(values))) # test default r
187
188 # Test implementation detail: tuple re-use
189## self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
190 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000191
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000192 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000193 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
194 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
195 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000196 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
197 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000198 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000199 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000200 self.assertEqual(list(islice(count(maxsize-5), 10)),
201 list(range(maxsize-5, maxsize+5)))
202 self.assertEqual(list(islice(count(-maxsize-5), 10)),
203 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000204 c = count(3)
205 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000206 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000207 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000208 c = count(-9)
209 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000210 next(c)
211 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000212 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000213 # Test repr (ignoring the L in longs)
214 r1 = repr(count(i)).replace('L', '')
215 r2 = 'count(%r)'.__mod__(i).replace('L', '')
216 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000217
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000218 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000219 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000220 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000221 self.assertRaises(TypeError, cycle)
222 self.assertRaises(TypeError, cycle, 5)
223 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000224
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000225 def test_groupby(self):
226 # Check whether it accepts arguments correctly
227 self.assertEqual([], list(groupby([])))
228 self.assertEqual([], list(groupby([], key=id)))
229 self.assertRaises(TypeError, list, groupby('abc', []))
230 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000231 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000232
233 # Check normal input
234 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
235 (2,15,22), (3,16,23), (3,17,23)]
236 dup = []
237 for k, g in groupby(s, lambda r:r[0]):
238 for elem in g:
239 self.assertEqual(k, elem[0])
240 dup.append(elem)
241 self.assertEqual(s, dup)
242
243 # Check nested case
244 dup = []
245 for k, g in groupby(s, lambda r:r[0]):
246 for ik, ig in groupby(g, lambda r:r[2]):
247 for elem in ig:
248 self.assertEqual(k, elem[0])
249 self.assertEqual(ik, elem[2])
250 dup.append(elem)
251 self.assertEqual(s, dup)
252
253 # Check case where inner iterator is not used
254 keys = [k for k, g in groupby(s, lambda r:r[0])]
255 expectedkeys = set([r[0] for r in s])
256 self.assertEqual(set(keys), expectedkeys)
257 self.assertEqual(len(keys), len(expectedkeys))
258
259 # Exercise pipes and filters style
260 s = 'abracadabra'
261 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000262 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000263 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
264 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000265 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000266 self.assertEqual(r, ['a', 'b', 'r'])
267 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000268 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000269 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
270 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000271 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000272 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
273
Georg Brandla18af4e2007-04-21 15:47:16 +0000274 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000275 class ExpectedError(Exception):
276 pass
277 def delayed_raise(n=0):
278 for i in range(n):
279 yield 'yo'
280 raise ExpectedError
281 def gulp(iterable, keyp=None, func=list):
282 return [func(g) for k, g in groupby(iterable, keyp)]
283
Georg Brandla18af4e2007-04-21 15:47:16 +0000284 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000285 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000286 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000287 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
288
289 # __cmp__ failure
290 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000291 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000292 raise ExpectedError
293 s = [DummyCmp(), DummyCmp(), None]
294
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000295 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000296 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000297 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000298 self.assertRaises(ExpectedError, gulp, s)
299
300 # keyfunc failure
301 def keyfunc(obj):
302 if keyfunc.skip > 0:
303 keyfunc.skip -= 1
304 return obj
305 else:
306 raise ExpectedError
307
308 # keyfunc failure on outer object
309 keyfunc.skip = 0
310 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
311 keyfunc.skip = 1
312 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
313
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000314 def test_filter(self):
315 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
316 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
317 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
318 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
319 self.assertRaises(TypeError, filter)
320 self.assertRaises(TypeError, filter, lambda x:x)
321 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
322 self.assertRaises(TypeError, filter, isEven, 3)
323 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000324
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000325 def test_filterfalse(self):
326 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
327 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
328 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
329 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
330 self.assertRaises(TypeError, filterfalse)
331 self.assertRaises(TypeError, filterfalse, lambda x:x)
332 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
333 self.assertRaises(TypeError, filterfalse, isEven, 3)
334 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000335
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000336 def test_zip(self):
337 # XXX This is rather silly now that builtin zip() calls zip()...
338 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000339 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000340 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
341 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
342 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
343 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
344 self.assertEqual(list(zip()), lzip())
345 self.assertRaises(TypeError, zip, 3)
346 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000347 # Check tuple re-use (implementation detail)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000348 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000349 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000350 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000351 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000352 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000353 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000354 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000355 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000356
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000357 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000358 for args in [
359 ['abc', range(6)],
360 [range(6), 'abc'],
361 [range(1000), range(2000,2100), range(3000,3050)],
362 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
363 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
364 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000365 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
366 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000367 self.assertEqual(list(zip_longest(*args)), target)
368 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000369 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 +0000370 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000371
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000372 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 +0000373
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000374 self.assertEqual(list(zip_longest()), list(zip()))
375 self.assertEqual(list(zip_longest([])), list(zip([])))
376 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000377
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000378 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000379 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000380 self.assertRaises(TypeError, zip_longest, 3)
381 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000382
383 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000384 "zip_longest('abc', fv=1)",
385 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386 ]:
387 try:
388 eval(stmt, globals(), locals())
389 except TypeError:
390 pass
391 else:
392 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000393
Thomas Wouterscf297e42007-02-23 15:07:44 +0000394 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000395 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000397 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000399 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000400 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000401 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000402 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
403
Christian Heimesc3f30c42008-02-22 16:37:40 +0000404 def test_product(self):
405 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000406 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000407 (['ab'], [('a',), ('b',)]), # one iterable
408 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
409 ([range(0), range(2), range(3)], []), # first iterable with zero length
410 ([range(2), range(0), range(3)], []), # middle iterable with zero length
411 ([range(2), range(3), range(0)], []), # last iterable with zero length
412 ]:
413 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000414 for r in range(4):
415 self.assertEqual(list(product(*(args*r))),
416 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000417 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
418 self.assertRaises(TypeError, product, range(6), None)
419 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
420 set('abcdefg'), range(11), tuple(range(13))]
421 for i in range(100):
422 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000423 expected_len = prod(map(len, args))
424 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000425 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000426 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000427
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000428 # Test implementation detail: tuple re-use
429 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
430 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000431
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000432 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000433 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000434 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000435 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000436 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000437 self.assertEqual(list(repeat('a', 0)), [])
438 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000439 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000440 self.assertRaises(TypeError, repeat, None, 3, 4)
441 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000442 r = repeat(1+0j)
443 self.assertEqual(repr(r), 'repeat((1+0j))')
444 r = repeat(1+0j, 5)
445 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
446 list(r)
447 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000448
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000449 def test_map(self):
450 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000451 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000452 def tupleize(*args):
453 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000454 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000455 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000456 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000457 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000458 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000459 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000460 self.assertEqual(list(map(operator.pow, [])), [])
461 self.assertRaises(TypeError, map)
462 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
463 self.assertRaises(TypeError, map, operator.neg)
464 self.assertRaises(TypeError, next, map(10, range(5)))
465 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
466 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000467
468 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000469 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
470 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000471 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000472 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000473 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000474 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
475 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000476 self.assertRaises(TypeError, starmap)
477 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000478 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
479 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
480 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000481
482 def test_islice(self):
483 for args in [ # islice(args) should agree with range(args)
484 (10, 20, 3),
485 (10, 3, 20),
486 (10, 20),
487 (10, 3),
488 (20,)
489 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000490 self.assertEqual(list(islice(range(100), *args)),
491 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000492
493 for args, tgtargs in [ # Stop when seqn is exhausted
494 ((10, 110, 3), ((10, 100, 3))),
495 ((10, 110), ((10, 100))),
496 ((110,), (100,))
497 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000498 self.assertEqual(list(islice(range(100), *args)),
499 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000500
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000501 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000502 self.assertEqual(list(islice(range(10), None)), list(range(10)))
503 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
504 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
505 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
506 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000507
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000508 # Test number of items consumed SF #1171417
509 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000510 self.assertEqual(list(islice(it, 3)), list(range(3)))
511 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000512
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000513 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000514 self.assertRaises(TypeError, islice, range(10))
515 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
516 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
517 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
518 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
519 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
520 self.assertRaises(ValueError, islice, range(10), 'a')
521 self.assertRaises(ValueError, islice, range(10), 'a', 1)
522 self.assertRaises(ValueError, islice, range(10), 1, 'a')
523 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
524 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000525 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000526
527 def test_takewhile(self):
528 data = [1, 3, 5, 20, 2, 4, 6, 8]
529 underten = lambda x: x<10
530 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000531 self.assertEqual(list(takewhile(underten, [])), [])
532 self.assertRaises(TypeError, takewhile)
533 self.assertRaises(TypeError, takewhile, operator.pow)
534 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000535 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
536 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000537 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
538 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000539 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000540
541 def test_dropwhile(self):
542 data = [1, 3, 5, 20, 2, 4, 6, 8]
543 underten = lambda x: x<10
544 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000545 self.assertEqual(list(dropwhile(underten, [])), [])
546 self.assertRaises(TypeError, dropwhile)
547 self.assertRaises(TypeError, dropwhile, operator.pow)
548 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000549 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
550 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000551
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000552 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000553 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000554 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000555 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000556 yield i
557
558 a, b = tee([]) # test empty iterator
559 self.assertEqual(list(a), [])
560 self.assertEqual(list(b), [])
561
562 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000563 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000564
565 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000566 self.assertEqual(list(a), list(range(n)))
567 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000568
569 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000570 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000571 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000572 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000573 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000574
575 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000576 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000577 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000578 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000579 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000580
Guido van Rossum805365e2007-05-07 22:24:25 +0000581 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000582 order = [0]*n + [1]*n
583 random.shuffle(order)
584 lists = ([], [])
585 its = tee(irange(n))
586 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000587 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000588 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000589 self.assertEqual(lists[0], list(range(n)))
590 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000591
Raymond Hettingerad983e72003-11-12 14:32:26 +0000592 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000593 self.assertRaises(TypeError, tee)
594 self.assertRaises(TypeError, tee, 3)
595 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000596 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000597
Raymond Hettingerad983e72003-11-12 14:32:26 +0000598 # tee object should be instantiable
599 a, b = tee('abc')
600 c = type(a)('def')
601 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000602
Raymond Hettingerad983e72003-11-12 14:32:26 +0000603 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000604 a, b, c = tee(range(2000), 3)
605 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000606 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000607 self.assertEqual(list(b), list(range(2000)))
608 self.assertEqual([next(c), next(c)], list(range(2)))
609 self.assertEqual(list(a), list(range(100,2000)))
610 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000611
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000612 # test values of n
613 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000614 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000615 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000616 result = tee('abc', n)
617 self.assertEqual(type(result), tuple)
618 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000619 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000620
Raymond Hettingerad983e72003-11-12 14:32:26 +0000621 # tee pass-through to copyable iterator
622 a, b = tee('abc')
623 c, d = tee(a)
624 self.assert_(a is c)
625
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000626 # test tee_new
627 t1, t2 = tee('abc')
628 tnew = type(t1)
629 self.assertRaises(TypeError, tnew)
630 self.assertRaises(TypeError, tnew, 10)
631 t3 = tnew(t1)
632 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000633
Raymond Hettingera9f60922004-10-17 16:40:14 +0000634 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000635 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000636 p = proxy(a)
637 self.assertEqual(getattr(p, '__class__'), type(b))
638 del a
639 self.assertRaises(ReferenceError, getattr, p, '__class__')
640
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000641 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000642 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000643
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000644 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000645 self.assertRaises(StopIteration, next, f([]))
646 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000647
Georg Brandla18af4e2007-04-21 15:47:16 +0000648 self.assertRaises(StopIteration, next, islice([], None))
649 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000650
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000651 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000652 self.assertRaises(StopIteration, next, p)
653 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000654 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000655 self.assertRaises(StopIteration, next, p)
656 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000657
Georg Brandla18af4e2007-04-21 15:47:16 +0000658 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000659
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000660 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000661 self.assertRaises(StopIteration, next, f(lambda x:x, []))
662 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000663
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000664class TestGC(unittest.TestCase):
665
666 def makecycle(self, iterator, container):
667 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000668 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000669 del container, iterator
670
671 def test_chain(self):
672 a = []
673 self.makecycle(chain(a), a)
674
675 def test_cycle(self):
676 a = []
677 self.makecycle(cycle([a]*2), a)
678
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000679 def test_dropwhile(self):
680 a = []
681 self.makecycle(dropwhile(bool, [0, a, a]), a)
682
683 def test_groupby(self):
684 a = []
685 self.makecycle(groupby([a]*2, lambda x:x), a)
686
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000687 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000688 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000689 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000690
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000691 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000692 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000693 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000694
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000695 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000696 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000697 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000698
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000699 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000700 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000701 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000702
703 def test_islice(self):
704 a = []
705 self.makecycle(islice([a]*2, None), a)
706
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000707 def test_repeat(self):
708 a = []
709 self.makecycle(repeat(a), a)
710
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000711 def test_starmap(self):
712 a = []
713 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
714
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000715 def test_takewhile(self):
716 a = []
717 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
718
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000719def R(seqn):
720 'Regular generator'
721 for i in seqn:
722 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000723
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000724class G:
725 'Sequence using __getitem__'
726 def __init__(self, seqn):
727 self.seqn = seqn
728 def __getitem__(self, i):
729 return self.seqn[i]
730
731class I:
732 'Sequence using iterator protocol'
733 def __init__(self, seqn):
734 self.seqn = seqn
735 self.i = 0
736 def __iter__(self):
737 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000738 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000739 if self.i >= len(self.seqn): raise StopIteration
740 v = self.seqn[self.i]
741 self.i += 1
742 return v
743
744class Ig:
745 'Sequence using iterator protocol defined with a generator'
746 def __init__(self, seqn):
747 self.seqn = seqn
748 self.i = 0
749 def __iter__(self):
750 for val in self.seqn:
751 yield val
752
753class X:
754 'Missing __getitem__ and __iter__'
755 def __init__(self, seqn):
756 self.seqn = seqn
757 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000758 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000759 if self.i >= len(self.seqn): raise StopIteration
760 v = self.seqn[self.i]
761 self.i += 1
762 return v
763
764class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000765 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000766 def __init__(self, seqn):
767 self.seqn = seqn
768 self.i = 0
769 def __iter__(self):
770 return self
771
772class E:
773 'Test propagation of exceptions'
774 def __init__(self, seqn):
775 self.seqn = seqn
776 self.i = 0
777 def __iter__(self):
778 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000779 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000780 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000781
782class S:
783 'Test immediate stop'
784 def __init__(self, seqn):
785 pass
786 def __iter__(self):
787 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000788 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000789 raise StopIteration
790
791def L(seqn):
792 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000793 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000794
795
796class TestVariousIteratorArgs(unittest.TestCase):
797
798 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000799 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000800 for g in (G, I, Ig, S, L, R):
801 self.assertEqual(list(chain(g(s))), list(g(s)))
802 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000803 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +0000804 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000805 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
806
Christian Heimesc3f30c42008-02-22 16:37:40 +0000807 def test_product(self):
808 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
809 self.assertRaises(TypeError, product, X(s))
810 self.assertRaises(TypeError, product, N(s))
811 self.assertRaises(ZeroDivisionError, product, E(s))
812
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000813 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000814 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000815 for g in (G, I, Ig, S, L, R):
816 tgtlen = len(s) * 3
817 expected = list(g(s))*3
818 actual = list(islice(cycle(g(s)), tgtlen))
819 self.assertEqual(actual, expected)
820 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000821 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000822 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
823
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000824 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000825 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000826 for g in (G, I, Ig, S, L, R):
827 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
828 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000829 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000830 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
831
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000832 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000833 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000834 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000835 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000836 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000837 self.assertRaises(TypeError, filter, isEven, X(s))
838 self.assertRaises(TypeError, filter, isEven, N(s))
839 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000840
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000841 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000842 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000843 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000844 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000845 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000846 self.assertRaises(TypeError, filterfalse, isEven, X(s))
847 self.assertRaises(TypeError, filterfalse, isEven, N(s))
848 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000849
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000850 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000851 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000852 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000853 self.assertEqual(list(zip(g(s))), lzip(g(s)))
854 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
855 self.assertRaises(TypeError, zip, X(s))
856 self.assertRaises(TypeError, zip, N(s))
857 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000858
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000859 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000860 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000861 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000862 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
863 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
864 self.assertRaises(TypeError, zip_longest, X(s))
865 self.assertRaises(TypeError, zip_longest, N(s))
866 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000867
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000868 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000869 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000870 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000871 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000872 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000873 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000874 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000875 self.assertRaises(TypeError, map, onearg, X(s))
876 self.assertRaises(TypeError, map, onearg, N(s))
877 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000878
879 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000880 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000881 for g in (G, I, Ig, S, L, R):
882 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
883 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000884 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000885 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
886
887 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000888 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000889 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000890 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000891 self.assertEqual(list(starmap(operator.pow, g(ss))),
892 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000893 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000894 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000895 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
896
897 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000898 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000899 for g in (G, I, Ig, S, L, R):
900 tgt = []
901 for elem in g(s):
902 if not isEven(elem): break
903 tgt.append(elem)
904 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
905 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000906 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000907 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
908
909 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000910 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000911 for g in (G, I, Ig, S, L, R):
912 tgt = []
913 for elem in g(s):
914 if not tgt and isOdd(elem): continue
915 tgt.append(elem)
916 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
917 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000918 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000919 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
920
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000921 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000922 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000923 for g in (G, I, Ig, S, L, R):
924 it1, it2 = tee(g(s))
925 self.assertEqual(list(it1), list(g(s)))
926 self.assertEqual(list(it2), list(g(s)))
927 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000928 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000929 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
930
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000931class LengthTransparency(unittest.TestCase):
932
933 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000934 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000935 self.assertEqual(len(repeat(None, 50)), 50)
936 self.assertRaises(TypeError, len, repeat(None))
937
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000938class RegressionTests(unittest.TestCase):
939
940 def test_sf_793826(self):
941 # Fix Armin Rigo's successful efforts to wreak havoc
942
943 def mutatingtuple(tuple1, f, tuple2):
944 # this builds a tuple t which is a copy of tuple1,
945 # then calls f(t), then mutates t to be equal to tuple2
946 # (needs len(tuple1) == len(tuple2)).
947 def g(value, first=[1]):
948 if first:
949 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000950 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000951 return value
952 items = list(tuple2)
953 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000954 gen = map(g, items)
955 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000956 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000957
958 def f(t):
959 global T
960 T = t
961 first[:] = list(T)
962
963 first = []
964 mutatingtuple((1,2,3), f, (4,5,6))
965 second = list(T)
966 self.assertEqual(first, second)
967
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000968
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000969 def test_sf_950057(self):
970 # Make sure that chain() and cycle() catch exceptions immediately
971 # rather than when shifting between input sources
972
973 def gen1():
974 hist.append(0)
975 yield 1
976 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000977 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000978 hist.append(2)
979
980 def gen2(x):
981 hist.append(3)
982 yield 2
983 hist.append(4)
984 if x:
985 raise StopIteration
986
987 hist = []
988 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
989 self.assertEqual(hist, [0,1])
990
991 hist = []
992 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
993 self.assertEqual(hist, [0,1])
994
995 hist = []
996 self.assertRaises(AssertionError, list, cycle(gen1()))
997 self.assertEqual(hist, [0,1])
998
Thomas Woutersb2137042007-02-01 18:02:27 +0000999class SubclassWithKwargsTest(unittest.TestCase):
1000 def test_keywords_in_subclass(self):
1001 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001002 for cls in (repeat, zip, filter, filterfalse, chain, map,
Thomas Woutersb2137042007-02-01 18:02:27 +00001003 starmap, islice, takewhile, dropwhile, cycle):
1004 class Subclass(cls):
1005 def __init__(self, newarg=None, *args):
1006 cls.__init__(self, *args)
1007 try:
1008 Subclass(newarg=1)
1009 except TypeError as err:
1010 # we expect type errors because of wrong argument count
1011 self.failIf("does not take keyword arguments" in err.args[0])
1012
1013
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001014libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001015
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001016
1017>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001018>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001019... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001020...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001021Check 1200 is for $120.15
1022Check 1201 is for $764.05
1023Check 1202 is for $823.14
1024
1025>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001026>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001027... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001028...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000010291
10308
103127
1032
1033>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001034>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001035... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001036...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001037Alex
1038Laura
1039Martin
1040Walter
1041Samuele
1042
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001043>>> from operator import itemgetter
1044>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001045>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001046>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001047... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001048...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000010491 ['a', 'c', 'e']
10502 ['b', 'd', 'f']
10513 ['g']
1052
Raymond Hettinger734fb572004-01-20 20:04:40 +00001053# Find runs of consecutive numbers using groupby. The key to the solution
1054# is differencing with a range so that consecutive numbers all appear in
1055# same group.
1056>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001057>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001058... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001059...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001060[1]
1061[4, 5, 6]
1062[10]
1063[15, 16, 17, 18]
1064[22]
1065[25, 26, 27, 28]
1066
Raymond Hettingera098b332003-09-08 23:58:40 +00001067>>> def take(n, seq):
1068... return list(islice(seq, n))
1069
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001070>>> def enumerate(iterable):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001071... return zip(count(), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001072
1073>>> def tabulate(function):
1074... "Return function(0), function(1), ..."
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001075... return map(function, count())
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001076
1077>>> def iteritems(mapping):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001078... return zip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001079
1080>>> def nth(iterable, n):
1081... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001082... return list(islice(iterable, n, n+1))
1083
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001084>>> def all(seq, pred=None):
1085... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001086... for elem in filterfalse(pred, seq):
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001087... return False
1088... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +00001089
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001090>>> def any(seq, pred=None):
1091... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001092... for elem in filter(pred, seq):
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001093... return True
1094... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +00001095
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001096>>> def no(seq, pred=None):
1097... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001098... for elem in filter(pred, seq):
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001099... return False
1100... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +00001101
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001102>>> def quantify(seq, pred=None):
1103... "Count how many times the predicate is true in the sequence"
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001104... return sum(map(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001105
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001106>>> def padnone(seq):
1107... "Returns the sequence elements and then returns None indefinitely"
1108... return chain(seq, repeat(None))
1109
1110>>> def ncycles(seq, n):
1111... "Returns the sequence elements n times"
1112... return chain(*repeat(seq, n))
1113
1114>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001115... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001116
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001117>>> def flatten(listOfLists):
1118... return list(chain(*listOfLists))
1119
1120>>> def repeatfunc(func, times=None, *args):
1121... "Repeat calls to func with specified arguments."
1122... " Example: repeatfunc(random.random)"
1123... if times is None:
1124... return starmap(func, repeat(args))
1125... else:
1126... return starmap(func, repeat(args, times))
1127
Raymond Hettingerd591f662003-10-26 15:34:50 +00001128>>> def pairwise(iterable):
1129... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1130... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001131... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001132... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001133... except StopIteration:
1134... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001135... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001136
1137This is not part of the examples but it tests to make sure the definitions
1138perform as purported.
1139
Raymond Hettingera098b332003-09-08 23:58:40 +00001140>>> take(10, count())
1141[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1142
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001143>>> list(enumerate('abc'))
1144[(0, 'a'), (1, 'b'), (2, 'c')]
1145
1146>>> list(islice(tabulate(lambda x: 2*x), 4))
1147[0, 2, 4, 6]
1148
1149>>> nth('abcde', 3)
1150['d']
1151
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001152>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001153True
1154
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001155>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001156False
1157
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001158>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001159True
1160
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001161>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001162False
1163
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001164>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001165True
1166
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001167>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001168False
1169
Guido van Rossum805365e2007-05-07 22:24:25 +00001170>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000117150
1172
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001173>>> a = [[1, 2, 3], [4, 5, 6]]
1174>>> flatten(a)
1175[1, 2, 3, 4, 5, 6]
1176
1177>>> list(repeatfunc(pow, 5, 2, 3))
1178[8, 8, 8, 8, 8]
1179
1180>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001181>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001182[0, 0, 0, 0, 0]
1183
Raymond Hettingerd591f662003-10-26 15:34:50 +00001184>>> list(pairwise('abcd'))
1185[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001186
Raymond Hettingerd591f662003-10-26 15:34:50 +00001187>>> list(pairwise([]))
1188[]
1189
1190>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001191[]
1192
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001193>>> list(islice(padnone('abc'), 0, 6))
1194['a', 'b', 'c', None, None, None]
1195
1196>>> list(ncycles('abc', 3))
1197['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1198
1199>>> dotproduct([1,2,3], [4,5,6])
120032
1201
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001202"""
1203
1204__test__ = {'libreftest' : libreftest}
1205
1206def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001207 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001208 RegressionTests, LengthTransparency,
1209 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001210 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001211
1212 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001213 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001214 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001215 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001216 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001217 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001218 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001219 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001220 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001221
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001222 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001223 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001224
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001225if __name__ == "__main__":
1226 test_main(verbose=True)