blob: d69aecf061c6e6683d87e82bb6a3bf5372980d40 [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 Hettingeraa044612009-02-12 12:04:26 +00005from decimal import Decimal
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +00006from fractions import Fraction
Raymond Hettinger2012f172003-02-07 05:32:58 +00007import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00009import random
Raymond Hettingere09f45a2009-11-30 19:44:40 +000010import copy
11import pickle
Senthil Kumaran3ddc4352010-01-08 18:41:40 +000012from functools import reduce
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +000013maxsize = test_support.MAX_Py_ssize_t
14minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015
16def onearg(x):
17 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000018 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000019
20def errfunc(*args):
21 'Test function that raises an error'
22 raise ValueError
23
24def gen3():
25 'Non-restartable source sequence'
26 for i in (0, 1, 2):
27 yield i
28
29def isEven(x):
30 'Test predicate'
31 return x%2==0
32
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000033def isOdd(x):
34 'Test predicate'
35 return x%2==1
36
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000037class StopNow:
38 'Class emulating an empty iterable.'
39 def __iter__(self):
40 return self
41 def next(self):
42 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043
Raymond Hettinger02420702003-06-29 20:36:23 +000044def take(n, seq):
45 'Convenience function for partially consuming a long of infinite iterable'
46 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000047
Raymond Hettingerd553d852008-03-04 04:17:08 +000048def prod(iterable):
49 return reduce(operator.mul, iterable, 1)
50
Raymond Hettinger93e804d2008-02-26 23:40:50 +000051def fact(n):
52 'Factorial'
Raymond Hettingerd553d852008-03-04 04:17:08 +000053 return prod(range(1, n+1))
54
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000056 def test_chain(self):
Raymond Hettingerad47fa12008-03-06 20:52:01 +000057
58 def chain2(*iterables):
59 'Pure python version in the docs'
60 for it in iterables:
61 for element in it:
62 yield element
63
64 for c in (chain, chain2):
65 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
66 self.assertEqual(list(c('abc')), list('abc'))
67 self.assertEqual(list(c('')), [])
68 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
69 self.assertRaises(TypeError, list,c(2, 3))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000070
Raymond Hettingerb4cbc982008-02-28 22:46:41 +000071 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]))
77
Raymond Hettinger93e804d2008-02-26 23:40:50 +000078 def test_combinations(self):
Raymond Hettinger5b913e32009-01-08 06:39:04 +000079 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Raymond Hettinger93e804d2008-02-26 23:40:50 +000080 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Raymond Hettingerd553d852008-03-04 04:17:08 +000081 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Raymond Hettinger93e804d2008-02-26 23:40:50 +000082 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5b913e32009-01-08 06:39:04 +000083 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Raymond Hettinger93e804d2008-02-26 23:40:50 +000084 self.assertEqual(list(combinations(range(4), 3)),
85 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Raymond Hettingerd553d852008-03-04 04:17:08 +000086
87 def combinations1(iterable, r):
88 'Pure python version shown in the docs'
89 pool = tuple(iterable)
90 n = len(pool)
Raymond Hettinger5b913e32009-01-08 06:39:04 +000091 if r > n:
92 return
Raymond Hettingerd553d852008-03-04 04:17:08 +000093 indices = range(r)
94 yield tuple(pool[i] for i in indices)
95 while 1:
96 for i in reversed(range(r)):
97 if indices[i] != i + n - r:
98 break
99 else:
100 return
101 indices[i] += 1
102 for j in range(i+1, r):
103 indices[j] = indices[j-1] + 1
104 yield tuple(pool[i] for i in indices)
105
106 def combinations2(iterable, r):
107 'Pure python version shown in the docs'
108 pool = tuple(iterable)
109 n = len(pool)
110 for indices in permutations(range(n), r):
111 if sorted(indices) == list(indices):
112 yield tuple(pool[i] for i in indices)
113
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000114 def combinations3(iterable, r):
115 'Pure python version from cwr()'
116 pool = tuple(iterable)
117 n = len(pool)
118 for indices in combinations_with_replacement(range(n), r):
119 if len(set(indices)) == r:
120 yield tuple(pool[i] for i in indices)
121
Raymond Hettingerd553d852008-03-04 04:17:08 +0000122 for n in range(7):
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000123 values = [5*x-12 for x in range(n)]
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000124 for r in range(n+2):
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000125 result = list(combinations(values, r))
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000126 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(r) // fact(n-r)) # right number of combs
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000127 self.assertEqual(len(result), len(set(result))) # no repeats
128 self.assertEqual(result, sorted(result)) # lexicographic order
129 for c in result:
130 self.assertEqual(len(c), r) # r-length combinations
131 self.assertEqual(len(set(c)), r) # no duplicate elements
132 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000133 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000134 self.assertEqual(list(c),
135 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000136 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000137 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000138 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Raymond Hettingerd553d852008-03-04 04:17:08 +0000139
140 # Test implementation detail: tuple re-use
141 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
142 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
143
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000144 def test_combinations_with_replacement(self):
145 cwr = combinations_with_replacement
146 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
147 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
148 self.assertRaises(TypeError, cwr, None) # pool is not iterable
149 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
150 self.assertEqual(list(cwr('ABC', 2)),
151 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
152
153 def cwr1(iterable, r):
154 'Pure python version shown in the docs'
155 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
156 pool = tuple(iterable)
157 n = len(pool)
158 if not n and r:
159 return
160 indices = [0] * r
161 yield tuple(pool[i] for i in indices)
162 while 1:
163 for i in reversed(range(r)):
164 if indices[i] != n - 1:
165 break
166 else:
167 return
168 indices[i:] = [indices[i] + 1] * (r - i)
169 yield tuple(pool[i] for i in indices)
170
171 def cwr2(iterable, r):
172 'Pure python version shown in the docs'
173 pool = tuple(iterable)
174 n = len(pool)
175 for indices in product(range(n), repeat=r):
176 if sorted(indices) == list(indices):
177 yield tuple(pool[i] for i in indices)
178
179 def numcombs(n, r):
180 if not n:
181 return 0 if r else 1
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000182 return fact(n+r-1) // fact(r) // fact(n-1)
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000183
184 for n in range(7):
185 values = [5*x-12 for x in range(n)]
186 for r in range(n+2):
187 result = list(cwr(values, r))
188
189 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
190 self.assertEqual(len(result), len(set(result))) # no repeats
191 self.assertEqual(result, sorted(result)) # lexicographic order
192
193 regular_combs = list(combinations(values, r)) # compare to combs without replacement
194 if n == 0 or r <= 1:
195 self.assertEquals(result, regular_combs) # cases that should be identical
196 else:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000197 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000198
199 for c in result:
200 self.assertEqual(len(c), r) # r-length combinations
201 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
202 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
203 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000204 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000205 self.assertEqual(noruns,
206 [e for e in values if e in c]) # comb is a subsequence of the input iterable
207 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
208 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
209
210 # Test implementation detail: tuple re-use
211 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
212 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
213
Raymond Hettingerd553d852008-03-04 04:17:08 +0000214 def test_permutations(self):
215 self.assertRaises(TypeError, permutations) # too few arguments
216 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000217 self.assertRaises(TypeError, permutations, None) # pool is not iterable
218 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000219 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000220 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Raymond Hettingerd553d852008-03-04 04:17:08 +0000221 self.assertEqual(list(permutations(range(3), 2)),
222 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
223
224 def permutations1(iterable, r=None):
225 'Pure python version shown in the docs'
226 pool = tuple(iterable)
227 n = len(pool)
228 r = n if r is None else r
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000229 if r > n:
230 return
Raymond Hettingerd553d852008-03-04 04:17:08 +0000231 indices = range(n)
Raymond Hettingere70bb8d2008-03-23 00:55:46 +0000232 cycles = range(n, n-r, -1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000233 yield tuple(pool[i] for i in indices[:r])
234 while n:
235 for i in reversed(range(r)):
236 cycles[i] -= 1
237 if cycles[i] == 0:
238 indices[i:] = indices[i+1:] + indices[i:i+1]
239 cycles[i] = n - i
240 else:
241 j = cycles[i]
242 indices[i], indices[-j] = indices[-j], indices[i]
243 yield tuple(pool[i] for i in indices[:r])
244 break
245 else:
246 return
247
248 def permutations2(iterable, r=None):
249 'Pure python version shown in the docs'
250 pool = tuple(iterable)
251 n = len(pool)
252 r = n if r is None else r
253 for indices in product(range(n), repeat=r):
254 if len(set(indices)) == r:
255 yield tuple(pool[i] for i in indices)
256
257 for n in range(7):
258 values = [5*x-12 for x in range(n)]
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000259 for r in range(n+2):
Raymond Hettingerd553d852008-03-04 04:17:08 +0000260 result = list(permutations(values, r))
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000261 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(n-r)) # right number of perms
Raymond Hettingerd553d852008-03-04 04:17:08 +0000262 self.assertEqual(len(result), len(set(result))) # no repeats
263 self.assertEqual(result, sorted(result)) # lexicographic order
264 for p in result:
265 self.assertEqual(len(p), r) # r-length permutations
266 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000267 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000268 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000269 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Raymond Hettingerd553d852008-03-04 04:17:08 +0000270 if r == n:
271 self.assertEqual(result, list(permutations(values, None))) # test r as None
272 self.assertEqual(result, list(permutations(values))) # test default r
273
274 # Test implementation detail: tuple re-use
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000275 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000276 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000277
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000278 def test_combinatorics(self):
279 # Test relationships between product(), permutations(),
280 # combinations() and combinations_with_replacement().
281
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000282 for n in range(6):
283 s = 'ABCDEFG'[:n]
284 for r in range(8):
285 prod = list(product(s, repeat=r))
286 cwr = list(combinations_with_replacement(s, r))
287 perm = list(permutations(s, r))
288 comb = list(combinations(s, r))
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000289
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000290 # Check size
291 self.assertEquals(len(prod), n**r)
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000292 self.assertEquals(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r))
293 self.assertEquals(len(perm), 0 if r>n else fact(n) // fact(n-r))
294 self.assertEquals(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000295
296 # Check lexicographic order without repeated tuples
297 self.assertEquals(prod, sorted(set(prod)))
298 self.assertEquals(cwr, sorted(set(cwr)))
299 self.assertEquals(perm, sorted(set(perm)))
300 self.assertEquals(comb, sorted(set(comb)))
301
302 # Check interrelationships
303 self.assertEquals(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
304 self.assertEquals(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
305 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
306 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
307 self.assertEqual(comb, filter(set(cwr).__contains__, perm)) # comb: perm that is a cwr
308 self.assertEqual(comb, filter(set(perm).__contains__, cwr)) # comb: cwr that is a perm
309 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000310
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000311 def test_compress(self):
Raymond Hettinger2e2909f2009-02-19 02:15:14 +0000312 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000313 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
314 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
315 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
316 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
317 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
318 n = 10000
319 data = chain.from_iterable(repeat(range(6), n))
320 selectors = chain.from_iterable(repeat((0, 1)))
321 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
322 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
323 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
324 self.assertRaises(TypeError, compress, range(6)) # too few args
325 self.assertRaises(TypeError, compress, range(6), None) # too many args
326
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000327 def test_count(self):
328 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
329 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000330 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000331 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
332 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000333 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000334 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000335 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
336 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000337 c = count(3)
338 self.assertEqual(repr(c), 'count(3)')
339 c.next()
340 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +0000341 c = count(-9)
342 self.assertEqual(repr(c), 'count(-9)')
343 c.next()
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000344 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Jack Diederich36234e82006-09-21 17:50:26 +0000345 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000346 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
Raymond Hettinger3a0de082007-10-12 17:53:11 +0000347 # Test repr (ignoring the L in longs)
348 r1 = repr(count(i)).replace('L', '')
349 r2 = 'count(%r)'.__mod__(i).replace('L', '')
350 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000351
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000352 # check copy, deepcopy, pickle
353 for value in -3, 3, sys.maxint-5, sys.maxint+5:
354 c = count(value)
355 self.assertEqual(next(copy.copy(c)), value)
356 self.assertEqual(next(copy.deepcopy(c)), value)
357 self.assertEqual(next(pickle.loads(pickle.dumps(c))), value)
358
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000359 def test_count_with_stride(self):
360 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingera4038032009-02-14 00:25:51 +0000361 self.assertEqual(zip('abc',count(start=2,step=3)),
362 [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingeraa681c72009-02-21 07:17:22 +0000363 self.assertEqual(zip('abc',count(step=-1)),
364 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000365 self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
366 self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
367 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
368 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
369 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettingeraa044612009-02-12 12:04:26 +0000370 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
371 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +0000372 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
373 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000374 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
375 c = count(3, 5)
376 self.assertEqual(repr(c), 'count(3, 5)')
377 c.next()
378 self.assertEqual(repr(c), 'count(8, 5)')
379 c = count(-9, 0)
380 self.assertEqual(repr(c), 'count(-9, 0)')
381 c.next()
382 self.assertEqual(repr(c), 'count(-9, 0)')
383 c = count(-9, -3)
384 self.assertEqual(repr(c), 'count(-9, -3)')
385 c.next()
386 self.assertEqual(repr(c), 'count(-12, -3)')
387 self.assertEqual(repr(c), 'count(-12, -3)')
388 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
389 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
390 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
391 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
392 for j in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5):
393 # Test repr (ignoring the L in longs)
394 r1 = repr(count(i, j)).replace('L', '')
395 if j == 1:
396 r2 = ('count(%r)' % i).replace('L', '')
397 else:
398 r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
399 self.assertEqual(r1, r2)
400
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000401 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000402 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000403 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000404 self.assertRaises(TypeError, cycle)
405 self.assertRaises(TypeError, cycle, 5)
406 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000407
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000408 def test_groupby(self):
409 # Check whether it accepts arguments correctly
410 self.assertEqual([], list(groupby([])))
411 self.assertEqual([], list(groupby([], key=id)))
412 self.assertRaises(TypeError, list, groupby('abc', []))
413 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000414 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000415
416 # Check normal input
417 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
418 (2,15,22), (3,16,23), (3,17,23)]
419 dup = []
420 for k, g in groupby(s, lambda r:r[0]):
421 for elem in g:
422 self.assertEqual(k, elem[0])
423 dup.append(elem)
424 self.assertEqual(s, dup)
425
426 # Check nested case
427 dup = []
428 for k, g in groupby(s, lambda r:r[0]):
429 for ik, ig in groupby(g, lambda r:r[2]):
430 for elem in ig:
431 self.assertEqual(k, elem[0])
432 self.assertEqual(ik, elem[2])
433 dup.append(elem)
434 self.assertEqual(s, dup)
435
436 # Check case where inner iterator is not used
437 keys = [k for k, g in groupby(s, lambda r:r[0])]
438 expectedkeys = set([r[0] for r in s])
439 self.assertEqual(set(keys), expectedkeys)
440 self.assertEqual(len(keys), len(expectedkeys))
441
442 # Exercise pipes and filters style
443 s = 'abracadabra'
444 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000445 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000446 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
447 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000448 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000449 self.assertEqual(r, ['a', 'b', 'r'])
450 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000451 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000452 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
453 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000454 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000455 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
456
457 # iter.next failure
458 class ExpectedError(Exception):
459 pass
460 def delayed_raise(n=0):
461 for i in range(n):
462 yield 'yo'
463 raise ExpectedError
464 def gulp(iterable, keyp=None, func=list):
465 return [func(g) for k, g in groupby(iterable, keyp)]
466
467 # iter.next failure on outer object
468 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
469 # iter.next failure on inner object
470 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
471
472 # __cmp__ failure
473 class DummyCmp:
474 def __cmp__(self, dst):
475 raise ExpectedError
476 s = [DummyCmp(), DummyCmp(), None]
477
478 # __cmp__ failure on outer object
479 self.assertRaises(ExpectedError, gulp, s, func=id)
480 # __cmp__ failure on inner object
481 self.assertRaises(ExpectedError, gulp, s)
482
483 # keyfunc failure
484 def keyfunc(obj):
485 if keyfunc.skip > 0:
486 keyfunc.skip -= 1
487 return obj
488 else:
489 raise ExpectedError
490
491 # keyfunc failure on outer object
492 keyfunc.skip = 0
493 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
494 keyfunc.skip = 1
495 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
496
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000497 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000498 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000499 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000500 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000501 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000502 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000503 self.assertRaises(TypeError, ifilter, lambda x:x)
504 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000505 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000506 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000507
508 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000509 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
510 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000511 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000512 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000513 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000514 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
515 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000516 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000517 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000518
519 def test_izip(self):
520 ans = [(x,y) for x, y in izip('abc',count())]
521 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000522 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
523 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000524 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000525 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000526 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000527 self.assertRaises(TypeError, izip, 3)
528 self.assertRaises(TypeError, izip, range(3), 3)
529 # Check tuple re-use (implementation detail)
530 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
531 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000532 self.assertEqual([pair for pair in izip('abc', 'def')],
533 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000534 ids = map(id, izip('abc', 'def'))
535 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000536 ids = map(id, list(izip('abc', 'def')))
537 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000538
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000539 def test_iziplongest(self):
540 for args in [
541 ['abc', range(6)],
542 [range(6), 'abc'],
543 [range(1000), range(2000,2100), range(3000,3050)],
544 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
545 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
546 ]:
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000547 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
548 for i in range(max(map(len, args)))]
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000549 self.assertEqual(list(izip_longest(*args)), target)
550 self.assertEqual(list(izip_longest(*args, **{})), target)
551 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
552 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000553
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000554 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
555
556 self.assertEqual(list(izip_longest()), zip())
557 self.assertEqual(list(izip_longest([])), zip([]))
558 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000559
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000560 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
561 zip(list('abc') + [None], 'defg')) # empty keyword dict
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000562 self.assertRaises(TypeError, izip_longest, 3)
563 self.assertRaises(TypeError, izip_longest, range(3), 3)
564
565 for stmt in [
566 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000567 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000568 ]:
569 try:
570 eval(stmt, globals(), locals())
571 except TypeError:
572 pass
573 else:
574 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000575
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000576 # Check tuple re-use (implementation detail)
577 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
578 zip('abc', 'def'))
579 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
580 zip('abc', 'def'))
581 ids = map(id, izip_longest('abc', 'def'))
582 self.assertEqual(min(ids), max(ids))
583 ids = map(id, list(izip_longest('abc', 'def')))
584 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
585
Raymond Hettingerfa7dadd2009-11-01 20:45:16 +0000586 def test_bug_7244(self):
587
588 class Repeater(object):
589 # this class is similar to itertools.repeat
590 def __init__(self, o, t, e):
591 self.o = o
592 self.t = int(t)
593 self.e = e
594 def __iter__(self): # its iterator is itself
595 return self
596 def next(self):
597 if self.t > 0:
598 self.t -= 1
599 return self.o
600 else:
601 raise self.e
602
603 # Formerly this code in would fail in debug mode
604 # with Undetected Error and Stop Iteration
605 r1 = Repeater(1, 3, StopIteration)
606 r2 = Repeater(2, 4, StopIteration)
607 def run(r1, r2):
608 result = []
609 for i, j in izip_longest(r1, r2, fillvalue=0):
610 with test_support.captured_output('stdout'):
611 print (i, j)
612 result.append((i, j))
613 return result
614 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
615
616 # Formerly, the RuntimeError would be lost
617 # and StopIteration would stop as expected
618 r1 = Repeater(1, 3, RuntimeError)
619 r2 = Repeater(2, 4, StopIteration)
620 it = izip_longest(r1, r2, fillvalue=0)
621 self.assertEqual(next(it), (1, 2))
622 self.assertEqual(next(it), (1, 2))
623 self.assertEqual(next(it), (1, 2))
624 self.assertRaises(RuntimeError, next, it)
625
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000626 def test_product(self):
627 for args, result in [
Raymond Hettingerd553d852008-03-04 04:17:08 +0000628 ([], [()]), # zero iterables
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000629 (['ab'], [('a',), ('b',)]), # one iterable
630 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
631 ([range(0), range(2), range(3)], []), # first iterable with zero length
632 ([range(2), range(0), range(3)], []), # middle iterable with zero length
633 ([range(2), range(3), range(0)], []), # last iterable with zero length
634 ]:
635 self.assertEqual(list(product(*args)), result)
Raymond Hettinger08ff6822008-02-29 02:21:48 +0000636 for r in range(4):
637 self.assertEqual(list(product(*(args*r))),
638 list(product(*args, **dict(repeat=r))))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000639 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
640 self.assertRaises(TypeError, product, range(6), None)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000641
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000642 def product1(*args, **kwds):
643 pools = map(tuple, args) * kwds.get('repeat', 1)
644 n = len(pools)
645 if n == 0:
646 yield ()
647 return
648 if any(len(pool) == 0 for pool in pools):
649 return
650 indices = [0] * n
651 yield tuple(pool[i] for pool, i in zip(pools, indices))
652 while 1:
653 for i in reversed(range(n)): # right to left
654 if indices[i] == len(pools[i]) - 1:
655 continue
656 indices[i] += 1
657 for j in range(i+1, n):
658 indices[j] = 0
659 yield tuple(pool[i] for pool, i in zip(pools, indices))
660 break
661 else:
662 return
663
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000664 def product2(*args, **kwds):
665 'Pure python version used in docs'
666 pools = map(tuple, args) * kwds.get('repeat', 1)
667 result = [[]]
668 for pool in pools:
669 result = [x+[y] for x in result for y in pool]
670 for prod in result:
671 yield tuple(prod)
672
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000673 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
674 set('abcdefg'), range(11), tuple(range(13))]
675 for i in range(100):
676 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000677 expected_len = prod(map(len, args))
678 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000679 self.assertEqual(list(product(*args)), list(product1(*args)))
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000680 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000681 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000682 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000683
Raymond Hettinger73d79632008-02-23 02:20:41 +0000684 # Test implementation detail: tuple re-use
685 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
686 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000687
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000688 def test_repeat(self):
Raymond Hettinger182edae2009-02-19 02:38:25 +0000689 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000690 self.assertEqual(zip(xrange(3),repeat('a')),
691 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000692 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000693 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000694 self.assertEqual(list(repeat('a', 0)), [])
695 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000696 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000697 self.assertRaises(TypeError, repeat, None, 3, 4)
698 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000699 r = repeat(1+0j)
700 self.assertEqual(repr(r), 'repeat((1+0j))')
701 r = repeat(1+0j, 5)
702 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
703 list(r)
704 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000705
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000706 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000707 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
708 [0**1, 1**2, 2**3])
709 self.assertEqual(list(imap(None, 'abc', range(5))),
710 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000711 self.assertEqual(list(imap(None, 'abc', count())),
712 [('a',0),('b',1),('c',2)])
713 self.assertEqual(take(2,imap(None, 'abc', count())),
714 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000715 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000716 self.assertRaises(TypeError, imap)
717 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000718 self.assertRaises(TypeError, imap(10, range(5)).next)
719 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
720 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000721
722 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000723 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
724 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000725 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
726 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000727 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000728 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
729 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000730 self.assertRaises(TypeError, starmap)
731 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
732 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
733 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
734 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000735
736 def test_islice(self):
737 for args in [ # islice(args) should agree with range(args)
738 (10, 20, 3),
739 (10, 3, 20),
740 (10, 20),
741 (10, 3),
742 (20,)
743 ]:
744 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
745
746 for args, tgtargs in [ # Stop when seqn is exhausted
747 ((10, 110, 3), ((10, 100, 3))),
748 ((10, 110), ((10, 100))),
749 ((110,), (100,))
750 ]:
751 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
752
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000753 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000754 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000755 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
756 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000757 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
758 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
759
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000760 # Test number of items consumed SF #1171417
761 it = iter(range(10))
762 self.assertEqual(list(islice(it, 3)), range(3))
763 self.assertEqual(list(it), range(3, 10))
764
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000765 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000766 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000767 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
768 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
769 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
770 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
771 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000772 self.assertRaises(ValueError, islice, xrange(10), 'a')
773 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
774 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
775 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
776 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000777 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000778
779 def test_takewhile(self):
780 data = [1, 3, 5, 20, 2, 4, 6, 8]
781 underten = lambda x: x<10
782 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000783 self.assertEqual(list(takewhile(underten, [])), [])
784 self.assertRaises(TypeError, takewhile)
785 self.assertRaises(TypeError, takewhile, operator.pow)
786 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
787 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
788 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000789 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
790 self.assertEqual(list(t), [1, 1, 1])
791 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000792
793 def test_dropwhile(self):
794 data = [1, 3, 5, 20, 2, 4, 6, 8]
795 underten = lambda x: x<10
796 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000797 self.assertEqual(list(dropwhile(underten, [])), [])
798 self.assertRaises(TypeError, dropwhile)
799 self.assertRaises(TypeError, dropwhile, operator.pow)
800 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
801 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
802 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000803
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000804 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000805 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000806 def irange(n):
807 for i in xrange(n):
808 yield i
809
810 a, b = tee([]) # test empty iterator
811 self.assertEqual(list(a), [])
812 self.assertEqual(list(b), [])
813
814 a, b = tee(irange(n)) # test 100% interleaved
815 self.assertEqual(zip(a,b), zip(range(n),range(n)))
816
817 a, b = tee(irange(n)) # test 0% interleaved
818 self.assertEqual(list(a), range(n))
819 self.assertEqual(list(b), range(n))
820
821 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000822 for i in xrange(100):
823 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000824 del a
825 self.assertEqual(list(b), range(n))
826
827 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000828 for i in xrange(100):
829 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000830 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000831 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000832
833 for j in xrange(5): # test randomly interleaved
834 order = [0]*n + [1]*n
835 random.shuffle(order)
836 lists = ([], [])
837 its = tee(irange(n))
838 for i in order:
839 value = its[i].next()
840 lists[i].append(value)
841 self.assertEqual(lists[0], range(n))
842 self.assertEqual(lists[1], range(n))
843
Raymond Hettingerad983e72003-11-12 14:32:26 +0000844 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000845 self.assertRaises(TypeError, tee)
846 self.assertRaises(TypeError, tee, 3)
847 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000848 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000849
Raymond Hettingerad983e72003-11-12 14:32:26 +0000850 # tee object should be instantiable
851 a, b = tee('abc')
852 c = type(a)('def')
853 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000854
Raymond Hettingerad983e72003-11-12 14:32:26 +0000855 # test long-lagged and multi-way split
856 a, b, c = tee(xrange(2000), 3)
857 for i in xrange(100):
858 self.assertEqual(a.next(), i)
859 self.assertEqual(list(b), range(2000))
860 self.assertEqual([c.next(), c.next()], range(2))
861 self.assertEqual(list(a), range(100,2000))
862 self.assertEqual(list(c), range(2,2000))
863
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000864 # test values of n
865 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000866 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000867 for n in xrange(5):
868 result = tee('abc', n)
869 self.assertEqual(type(result), tuple)
870 self.assertEqual(len(result), n)
871 self.assertEqual(map(list, result), [list('abc')]*n)
872
Raymond Hettingerad983e72003-11-12 14:32:26 +0000873 # tee pass-through to copyable iterator
874 a, b = tee('abc')
875 c, d = tee(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000876 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000877
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000878 # test tee_new
879 t1, t2 = tee('abc')
880 tnew = type(t1)
881 self.assertRaises(TypeError, tnew)
882 self.assertRaises(TypeError, tnew, 10)
883 t3 = tnew(t1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000884 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000885
Raymond Hettingera9f60922004-10-17 16:40:14 +0000886 # test that tee objects are weak referencable
887 a, b = tee(xrange(10))
888 p = proxy(a)
889 self.assertEqual(getattr(p, '__class__'), type(b))
890 del a
891 self.assertRaises(ReferenceError, getattr, p, '__class__')
892
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000893 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000894 self.assertRaises(StopIteration, izip().next)
895
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000896 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000897 self.assertRaises(StopIteration, f([]).next)
898 self.assertRaises(StopIteration, f(StopNow()).next)
899
900 self.assertRaises(StopIteration, islice([], None).next)
901 self.assertRaises(StopIteration, islice(StopNow(), None).next)
902
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000903 p, q = tee([])
904 self.assertRaises(StopIteration, p.next)
905 self.assertRaises(StopIteration, q.next)
906 p, q = tee(StopNow())
907 self.assertRaises(StopIteration, p.next)
908 self.assertRaises(StopIteration, q.next)
909
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000910 self.assertRaises(StopIteration, repeat(None, 0).next)
911
912 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
913 self.assertRaises(StopIteration, f(lambda x:x, []).next)
914 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
915
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000916class TestExamples(unittest.TestCase):
917
918 def test_chain(self):
919 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
920
921 def test_chain_from_iterable(self):
922 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
923
924 def test_combinations(self):
925 self.assertEqual(list(combinations('ABCD', 2)),
926 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
927 self.assertEqual(list(combinations(range(4), 3)),
928 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
929
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000930 def test_combinations_with_replacement(self):
931 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
932 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
933
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000934 def test_compress(self):
935 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
936
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000937 def test_count(self):
938 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
939
940 def test_cycle(self):
941 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
942
943 def test_dropwhile(self):
944 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
945
946 def test_groupby(self):
947 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
948 list('ABCDAB'))
949 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
950 [list('AAAA'), list('BBB'), list('CC'), list('D')])
951
952 def test_ifilter(self):
953 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
954
955 def test_ifilterfalse(self):
956 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
957
958 def test_imap(self):
959 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
960
961 def test_islice(self):
962 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
963 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
964 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
965 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
966
967 def test_izip(self):
968 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
969
970 def test_izip_longest(self):
971 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
972 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
973
974 def test_permutations(self):
975 self.assertEqual(list(permutations('ABCD', 2)),
976 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
977 self.assertEqual(list(permutations(range(3))),
978 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
979
980 def test_product(self):
981 self.assertEqual(list(product('ABCD', 'xy')),
982 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
983 self.assertEqual(list(product(range(2), repeat=3)),
984 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
985 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
986
987 def test_repeat(self):
988 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
989
990 def test_stapmap(self):
991 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
992 [32, 9, 1000])
993
994 def test_takewhile(self):
995 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
996
997
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000998class TestGC(unittest.TestCase):
999
1000 def makecycle(self, iterator, container):
1001 container.append(iterator)
1002 iterator.next()
1003 del container, iterator
1004
1005 def test_chain(self):
1006 a = []
1007 self.makecycle(chain(a), a)
1008
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001009 def test_chain_from_iterable(self):
1010 a = []
1011 self.makecycle(chain.from_iterable([a]), a)
1012
1013 def test_combinations(self):
1014 a = []
1015 self.makecycle(combinations([1,2,a,3], 3), a)
1016
Raymond Hettingerd081abc2009-01-27 02:58:49 +00001017 def test_combinations_with_replacement(self):
1018 a = []
1019 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1020
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001021 def test_compress(self):
1022 a = []
1023 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1024
Raymond Hettingerb21d8102009-02-16 20:39:12 +00001025 def test_count(self):
1026 a = []
1027 Int = type('Int', (int,), dict(x=a))
1028 self.makecycle(count(Int(0), Int(1)), a)
1029
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001030 def test_cycle(self):
1031 a = []
1032 self.makecycle(cycle([a]*2), a)
1033
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001034 def test_dropwhile(self):
1035 a = []
1036 self.makecycle(dropwhile(bool, [0, a, a]), a)
1037
1038 def test_groupby(self):
1039 a = []
1040 self.makecycle(groupby([a]*2, lambda x:x), a)
1041
Raymond Hettingera1ca94a2008-03-06 22:51:36 +00001042 def test_issue2246(self):
1043 # Issue 2246 -- the _grouper iterator was not included in GC
1044 n = 10
1045 keyfunc = lambda x: x
1046 for i, j in groupby(xrange(n), key=keyfunc):
1047 keyfunc.__dict__.setdefault('x',[]).append(j)
1048
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001049 def test_ifilter(self):
1050 a = []
1051 self.makecycle(ifilter(lambda x:True, [a]*2), a)
1052
1053 def test_ifilterfalse(self):
1054 a = []
1055 self.makecycle(ifilterfalse(lambda x:False, a), a)
1056
1057 def test_izip(self):
1058 a = []
1059 self.makecycle(izip([a]*2, [a]*3), a)
1060
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001061 def test_izip_longest(self):
1062 a = []
1063 self.makecycle(izip_longest([a]*2, [a]*3), a)
1064 b = [a, None]
1065 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
1066
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001067 def test_imap(self):
1068 a = []
1069 self.makecycle(imap(lambda x:x, [a]*2), a)
1070
1071 def test_islice(self):
1072 a = []
1073 self.makecycle(islice([a]*2, None), a)
1074
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001075 def test_permutations(self):
1076 a = []
1077 self.makecycle(permutations([1,2,a,3], 3), a)
1078
1079 def test_product(self):
1080 a = []
1081 self.makecycle(product([1,2,a,3], repeat=3), a)
1082
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001083 def test_repeat(self):
1084 a = []
1085 self.makecycle(repeat(a), a)
1086
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001087 def test_starmap(self):
1088 a = []
1089 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1090
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001091 def test_takewhile(self):
1092 a = []
1093 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1094
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001095def R(seqn):
1096 'Regular generator'
1097 for i in seqn:
1098 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001099
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001100class G:
1101 'Sequence using __getitem__'
1102 def __init__(self, seqn):
1103 self.seqn = seqn
1104 def __getitem__(self, i):
1105 return self.seqn[i]
1106
1107class I:
1108 'Sequence using iterator protocol'
1109 def __init__(self, seqn):
1110 self.seqn = seqn
1111 self.i = 0
1112 def __iter__(self):
1113 return self
1114 def next(self):
1115 if self.i >= len(self.seqn): raise StopIteration
1116 v = self.seqn[self.i]
1117 self.i += 1
1118 return v
1119
1120class Ig:
1121 'Sequence using iterator protocol defined with a generator'
1122 def __init__(self, seqn):
1123 self.seqn = seqn
1124 self.i = 0
1125 def __iter__(self):
1126 for val in self.seqn:
1127 yield val
1128
1129class X:
1130 'Missing __getitem__ and __iter__'
1131 def __init__(self, seqn):
1132 self.seqn = seqn
1133 self.i = 0
1134 def next(self):
1135 if self.i >= len(self.seqn): raise StopIteration
1136 v = self.seqn[self.i]
1137 self.i += 1
1138 return v
1139
1140class N:
1141 'Iterator missing next()'
1142 def __init__(self, seqn):
1143 self.seqn = seqn
1144 self.i = 0
1145 def __iter__(self):
1146 return self
1147
1148class E:
1149 'Test propagation of exceptions'
1150 def __init__(self, seqn):
1151 self.seqn = seqn
1152 self.i = 0
1153 def __iter__(self):
1154 return self
1155 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001156 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001157
1158class S:
1159 'Test immediate stop'
1160 def __init__(self, seqn):
1161 pass
1162 def __iter__(self):
1163 return self
1164 def next(self):
1165 raise StopIteration
1166
1167def L(seqn):
1168 'Test multiple tiers of iterators'
1169 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1170
1171
1172class TestVariousIteratorArgs(unittest.TestCase):
1173
1174 def test_chain(self):
1175 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1176 for g in (G, I, Ig, S, L, R):
1177 self.assertEqual(list(chain(g(s))), list(g(s)))
1178 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +00001179 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001180 self.assertRaises(TypeError, list, chain(N(s)))
1181 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1182
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001183 def test_compress(self):
1184 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1185 n = len(s)
1186 for g in (G, I, Ig, S, L, R):
1187 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1188 self.assertRaises(TypeError, compress, X(s), repeat(1))
1189 self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
1190 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1191
Raymond Hettinger50986cc2008-02-22 03:16:42 +00001192 def test_product(self):
1193 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1194 self.assertRaises(TypeError, product, X(s))
1195 self.assertRaises(TypeError, product, N(s))
1196 self.assertRaises(ZeroDivisionError, product, E(s))
1197
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001198 def test_cycle(self):
1199 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1200 for g in (G, I, Ig, S, L, R):
1201 tgtlen = len(s) * 3
1202 expected = list(g(s))*3
1203 actual = list(islice(cycle(g(s)), tgtlen))
1204 self.assertEqual(actual, expected)
1205 self.assertRaises(TypeError, cycle, X(s))
1206 self.assertRaises(TypeError, list, cycle(N(s)))
1207 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1208
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001209 def test_groupby(self):
1210 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1211 for g in (G, I, Ig, S, L, R):
1212 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1213 self.assertRaises(TypeError, groupby, X(s))
1214 self.assertRaises(TypeError, list, groupby(N(s)))
1215 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1216
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001217 def test_ifilter(self):
1218 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1219 for g in (G, I, Ig, S, L, R):
1220 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
1221 self.assertRaises(TypeError, ifilter, isEven, X(s))
1222 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
1223 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
1224
1225 def test_ifilterfalse(self):
1226 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1227 for g in (G, I, Ig, S, L, R):
1228 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
1229 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
1230 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
1231 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
1232
1233 def test_izip(self):
1234 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1235 for g in (G, I, Ig, S, L, R):
1236 self.assertEqual(list(izip(g(s))), zip(g(s)))
1237 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
1238 self.assertRaises(TypeError, izip, X(s))
1239 self.assertRaises(TypeError, list, izip(N(s)))
1240 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
1241
Raymond Hettingerd36862c2007-02-21 05:20:38 +00001242 def test_iziplongest(self):
1243 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1244 for g in (G, I, Ig, S, L, R):
1245 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
1246 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
1247 self.assertRaises(TypeError, izip_longest, X(s))
1248 self.assertRaises(TypeError, list, izip_longest(N(s)))
1249 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
1250
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001251 def test_imap(self):
1252 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1253 for g in (G, I, Ig, S, L, R):
1254 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
1255 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
1256 self.assertRaises(TypeError, imap, onearg, X(s))
1257 self.assertRaises(TypeError, list, imap(onearg, N(s)))
1258 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1259
1260 def test_islice(self):
1261 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1262 for g in (G, I, Ig, S, L, R):
1263 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1264 self.assertRaises(TypeError, islice, X(s), 10)
1265 self.assertRaises(TypeError, list, islice(N(s), 10))
1266 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1267
1268 def test_starmap(self):
1269 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1270 for g in (G, I, Ig, S, L, R):
1271 ss = zip(s, s)
1272 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1273 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1274 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1275 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1276
1277 def test_takewhile(self):
1278 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1279 for g in (G, I, Ig, S, L, R):
1280 tgt = []
1281 for elem in g(s):
1282 if not isEven(elem): break
1283 tgt.append(elem)
1284 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1285 self.assertRaises(TypeError, takewhile, isEven, X(s))
1286 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1287 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1288
1289 def test_dropwhile(self):
1290 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1291 for g in (G, I, Ig, S, L, R):
1292 tgt = []
1293 for elem in g(s):
1294 if not tgt and isOdd(elem): continue
1295 tgt.append(elem)
1296 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1297 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1298 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1299 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1300
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001301 def test_tee(self):
1302 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1303 for g in (G, I, Ig, S, L, R):
1304 it1, it2 = tee(g(s))
1305 self.assertEqual(list(it1), list(g(s)))
1306 self.assertEqual(list(it2), list(g(s)))
1307 self.assertRaises(TypeError, tee, X(s))
1308 self.assertRaises(TypeError, list, tee(N(s))[0])
1309 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1310
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001311class LengthTransparency(unittest.TestCase):
1312
1313 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001314 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001315 self.assertEqual(len(repeat(None, 50)), 50)
1316 self.assertRaises(TypeError, len, repeat(None))
1317
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001318class RegressionTests(unittest.TestCase):
1319
1320 def test_sf_793826(self):
1321 # Fix Armin Rigo's successful efforts to wreak havoc
1322
1323 def mutatingtuple(tuple1, f, tuple2):
1324 # this builds a tuple t which is a copy of tuple1,
1325 # then calls f(t), then mutates t to be equal to tuple2
1326 # (needs len(tuple1) == len(tuple2)).
1327 def g(value, first=[1]):
1328 if first:
1329 del first[:]
1330 f(z.next())
1331 return value
1332 items = list(tuple2)
1333 items[1:1] = list(tuple1)
1334 gen = imap(g, items)
1335 z = izip(*[gen]*len(tuple1))
1336 z.next()
1337
1338 def f(t):
1339 global T
1340 T = t
1341 first[:] = list(T)
1342
1343 first = []
1344 mutatingtuple((1,2,3), f, (4,5,6))
1345 second = list(T)
1346 self.assertEqual(first, second)
1347
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001348
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001349 def test_sf_950057(self):
1350 # Make sure that chain() and cycle() catch exceptions immediately
1351 # rather than when shifting between input sources
1352
1353 def gen1():
1354 hist.append(0)
1355 yield 1
1356 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001357 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001358 hist.append(2)
1359
1360 def gen2(x):
1361 hist.append(3)
1362 yield 2
1363 hist.append(4)
1364 if x:
1365 raise StopIteration
1366
1367 hist = []
1368 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1369 self.assertEqual(hist, [0,1])
1370
1371 hist = []
1372 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1373 self.assertEqual(hist, [0,1])
1374
1375 hist = []
1376 self.assertRaises(AssertionError, list, cycle(gen1()))
1377 self.assertEqual(hist, [0,1])
1378
Georg Brandlb84c1372007-01-21 10:28:43 +00001379class SubclassWithKwargsTest(unittest.TestCase):
1380 def test_keywords_in_subclass(self):
1381 # count is not subclassable...
1382 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001383 starmap, islice, takewhile, dropwhile, cycle, compress):
Georg Brandlb84c1372007-01-21 10:28:43 +00001384 class Subclass(cls):
1385 def __init__(self, newarg=None, *args):
1386 cls.__init__(self, *args)
1387 try:
1388 Subclass(newarg=1)
1389 except TypeError, err:
1390 # we expect type errors because of wrong argument count
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001391 self.assertFalse("does not take keyword arguments" in err.args[0])
Georg Brandlb84c1372007-01-21 10:28:43 +00001392
1393
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001394libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001395
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001396
1397>>> amounts = [120.15, 764.05, 823.14]
1398>>> for checknum, amount in izip(count(1200), amounts):
1399... print 'Check %d is for $%.2f' % (checknum, amount)
1400...
1401Check 1200 is for $120.15
1402Check 1201 is for $764.05
1403Check 1202 is for $823.14
1404
1405>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001406>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1407... print cube
1408...
14091
14108
141127
1412
1413>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001414>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001415... print name.title()
1416...
1417Alex
1418Laura
1419Martin
1420Walter
1421Samuele
1422
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001423>>> from operator import itemgetter
1424>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001425>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001426>>> for k, g in groupby(di, itemgetter(1)):
1427... print k, map(itemgetter(0), g)
1428...
14291 ['a', 'c', 'e']
14302 ['b', 'd', 'f']
14313 ['g']
1432
Raymond Hettinger734fb572004-01-20 20:04:40 +00001433# Find runs of consecutive numbers using groupby. The key to the solution
1434# is differencing with a range so that consecutive numbers all appear in
1435# same group.
1436>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Senthil Kumaran3ddc4352010-01-08 18:41:40 +00001437>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Raymond Hettinger734fb572004-01-20 20:04:40 +00001438... print map(operator.itemgetter(1), g)
1439...
1440[1]
1441[4, 5, 6]
1442[10]
1443[15, 16, 17, 18]
1444[22]
1445[25, 26, 27, 28]
1446
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001447>>> def take(n, iterable):
1448... "Return first n items of the iterable as a list"
1449... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001450
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001451>>> def enumerate(iterable, start=0):
1452... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001453
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001454>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001455... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001456... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001457
Raymond Hettingerf9bce832009-02-19 05:34:35 +00001458>>> def nth(iterable, n, default=None):
1459... "Returns the nth item or a default value"
1460... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001461
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001462>>> def quantify(iterable, pred=bool):
1463... "Count how many times the predicate is true"
1464... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001465
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001466>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001467... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001468... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001469
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001470>>> def ncycles(iterable, n):
1471... "Returns the seqeuence elements n times"
1472... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001473
1474>>> def dotproduct(vec1, vec2):
1475... return sum(imap(operator.mul, vec1, vec2))
1476
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001477>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001478... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001479
1480>>> def repeatfunc(func, times=None, *args):
1481... "Repeat calls to func with specified arguments."
1482... " Example: repeatfunc(random.random)"
1483... if times is None:
1484... return starmap(func, repeat(args))
1485... else:
1486... return starmap(func, repeat(args, times))
1487
Raymond Hettingerd591f662003-10-26 15:34:50 +00001488>>> def pairwise(iterable):
1489... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1490... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001491... for elem in b:
1492... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001493... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001494
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001495>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001496... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001497... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001498... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001499
1500>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001501... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001502... # Recipe credited to George Sakkis
1503... pending = len(iterables)
1504... nexts = cycle(iter(it).next for it in iterables)
1505... while pending:
1506... try:
1507... for next in nexts:
1508... yield next()
1509... except StopIteration:
1510... pending -= 1
1511... nexts = cycle(islice(nexts, pending))
1512
1513>>> def powerset(iterable):
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001514... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1515... s = list(iterable)
1516... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001517
Raymond Hettinger44e15812009-01-02 21:26:45 +00001518>>> def unique_everseen(iterable, key=None):
1519... "List unique elements, preserving order. Remember all elements ever seen."
1520... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1521... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1522... seen = set()
1523... seen_add = seen.add
1524... if key is None:
1525... for element in iterable:
1526... if element not in seen:
1527... seen_add(element)
1528... yield element
1529... else:
1530... for element in iterable:
1531... k = key(element)
1532... if k not in seen:
1533... seen_add(k)
1534... yield element
1535
1536>>> def unique_justseen(iterable, key=None):
1537... "List unique elements, preserving order. Remember only the element just seen."
1538... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1539... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1540... return imap(next, imap(itemgetter(1), groupby(iterable, key)))
1541
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001542This is not part of the examples but it tests to make sure the definitions
1543perform as purported.
1544
Raymond Hettingera098b332003-09-08 23:58:40 +00001545>>> take(10, count())
1546[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1547
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001548>>> list(enumerate('abc'))
1549[(0, 'a'), (1, 'b'), (2, 'c')]
1550
1551>>> list(islice(tabulate(lambda x: 2*x), 4))
1552[0, 2, 4, 6]
1553
1554>>> nth('abcde', 3)
Raymond Hettingerd507afd2009-02-04 10:52:32 +00001555'd'
1556
1557>>> nth('abcde', 9) is None
1558True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001559
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001560>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000156150
1562
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001563>>> a = [[1, 2, 3], [4, 5, 6]]
1564>>> flatten(a)
1565[1, 2, 3, 4, 5, 6]
1566
1567>>> list(repeatfunc(pow, 5, 2, 3))
1568[8, 8, 8, 8, 8]
1569
1570>>> import random
1571>>> take(5, imap(int, repeatfunc(random.random)))
1572[0, 0, 0, 0, 0]
1573
Raymond Hettingerd591f662003-10-26 15:34:50 +00001574>>> list(pairwise('abcd'))
1575[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001576
Raymond Hettingerd591f662003-10-26 15:34:50 +00001577>>> list(pairwise([]))
1578[]
1579
1580>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001581[]
1582
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001583>>> list(islice(padnone('abc'), 0, 6))
1584['a', 'b', 'c', None, None, None]
1585
1586>>> list(ncycles('abc', 3))
1587['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1588
1589>>> dotproduct([1,2,3], [4,5,6])
159032
1591
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001592>>> list(grouper(3, 'abcdefg', 'x'))
1593[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1594
1595>>> list(roundrobin('abc', 'd', 'ef'))
1596['a', 'd', 'e', 'b', 'f', 'c']
1597
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001598>>> list(powerset([1,2,3]))
1599[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001600
Raymond Hettinger560f9a82009-01-27 13:26:35 +00001601>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1602True
1603
1604>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1605True
1606
Raymond Hettinger44e15812009-01-02 21:26:45 +00001607>>> list(unique_everseen('AAAABBBCCDAABBB'))
1608['A', 'B', 'C', 'D']
1609
1610>>> list(unique_everseen('ABBCcAD', str.lower))
1611['A', 'B', 'C', 'D']
1612
1613>>> list(unique_justseen('AAAABBBCCDAABBB'))
1614['A', 'B', 'C', 'D', 'A', 'B']
1615
1616>>> list(unique_justseen('ABBCcAD', str.lower))
1617['A', 'B', 'C', 'A', 'D']
1618
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001619"""
1620
1621__test__ = {'libreftest' : libreftest}
1622
1623def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001624 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001625 RegressionTests, LengthTransparency,
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001626 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001627 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001628
1629 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001630 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001631 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001632 counts = [None] * 5
1633 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001634 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001635 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001636 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001637 print counts
1638
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001639 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001640 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001641
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001642if __name__ == "__main__":
1643 test_main(verbose=True)