blob: e65bba7f92387290da27129c10fa877d260b863a [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
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000044 def test_chain(self):
45 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertEqual(list(chain('abc')), list('abc'))
47 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000048 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000050
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051 def test_count(self):
52 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
53 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000054 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000055 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
56 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000057 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000058 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000059 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
60 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000061 c = count(3)
62 self.assertEqual(repr(c), 'count(3)')
63 c.next()
64 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000065 c = count(-9)
66 self.assertEqual(repr(c), 'count(-9)')
67 c.next()
68 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +000069 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 +000070 # Test repr (ignoring the L in longs)
71 r1 = repr(count(i)).replace('L', '')
72 r2 = 'count(%r)'.__mod__(i).replace('L', '')
73 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000074
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000075 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000076 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000077 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000078 self.assertRaises(TypeError, cycle)
79 self.assertRaises(TypeError, cycle, 5)
80 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000081
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000082 def test_groupby(self):
83 # Check whether it accepts arguments correctly
84 self.assertEqual([], list(groupby([])))
85 self.assertEqual([], list(groupby([], key=id)))
86 self.assertRaises(TypeError, list, groupby('abc', []))
87 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000088 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000089
90 # Check normal input
91 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
92 (2,15,22), (3,16,23), (3,17,23)]
93 dup = []
94 for k, g in groupby(s, lambda r:r[0]):
95 for elem in g:
96 self.assertEqual(k, elem[0])
97 dup.append(elem)
98 self.assertEqual(s, dup)
99
100 # Check nested case
101 dup = []
102 for k, g in groupby(s, lambda r:r[0]):
103 for ik, ig in groupby(g, lambda r:r[2]):
104 for elem in ig:
105 self.assertEqual(k, elem[0])
106 self.assertEqual(ik, elem[2])
107 dup.append(elem)
108 self.assertEqual(s, dup)
109
110 # Check case where inner iterator is not used
111 keys = [k for k, g in groupby(s, lambda r:r[0])]
112 expectedkeys = set([r[0] for r in s])
113 self.assertEqual(set(keys), expectedkeys)
114 self.assertEqual(len(keys), len(expectedkeys))
115
116 # Exercise pipes and filters style
117 s = 'abracadabra'
118 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
121 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000122 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000123 self.assertEqual(r, ['a', 'b', 'r'])
124 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000125 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
127 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000128 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000129 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
130
131 # iter.next failure
132 class ExpectedError(Exception):
133 pass
134 def delayed_raise(n=0):
135 for i in range(n):
136 yield 'yo'
137 raise ExpectedError
138 def gulp(iterable, keyp=None, func=list):
139 return [func(g) for k, g in groupby(iterable, keyp)]
140
141 # iter.next failure on outer object
142 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
143 # iter.next failure on inner object
144 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
145
146 # __cmp__ failure
147 class DummyCmp:
148 def __cmp__(self, dst):
149 raise ExpectedError
150 s = [DummyCmp(), DummyCmp(), None]
151
152 # __cmp__ failure on outer object
153 self.assertRaises(ExpectedError, gulp, s, func=id)
154 # __cmp__ failure on inner object
155 self.assertRaises(ExpectedError, gulp, s)
156
157 # keyfunc failure
158 def keyfunc(obj):
159 if keyfunc.skip > 0:
160 keyfunc.skip -= 1
161 return obj
162 else:
163 raise ExpectedError
164
165 # keyfunc failure on outer object
166 keyfunc.skip = 0
167 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
168 keyfunc.skip = 1
169 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
170
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000171 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000172 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000173 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000174 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000175 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilter, lambda x:x)
177 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000179 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180
181 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000182 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
183 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000184 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000185 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
187 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000188 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000190
191 def test_izip(self):
192 ans = [(x,y) for x, y in izip('abc',count())]
193 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
195 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000196 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000197 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000198 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000199 self.assertRaises(TypeError, izip, 3)
200 self.assertRaises(TypeError, izip, range(3), 3)
201 # Check tuple re-use (implementation detail)
202 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
203 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000204 self.assertEqual([pair for pair in izip('abc', 'def')],
205 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000206 ids = map(id, izip('abc', 'def'))
207 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000208 ids = map(id, list(izip('abc', 'def')))
209 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000211 def test_iziplongest(self):
212 for args in [
213 ['abc', range(6)],
214 [range(6), 'abc'],
215 [range(1000), range(2000,2100), range(3000,3050)],
216 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
217 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
218 ]:
219 target = map(None, *args)
220 self.assertEqual(list(izip_longest(*args)), target)
221 self.assertEqual(list(izip_longest(*args, **{})), target)
222 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
223 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000224
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000225 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
226
227 self.assertEqual(list(izip_longest()), zip())
228 self.assertEqual(list(izip_longest([])), zip([]))
229 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000230
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000231 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
232 self.assertRaises(TypeError, izip_longest, 3)
233 self.assertRaises(TypeError, izip_longest, range(3), 3)
234
235 for stmt in [
236 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000237 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000238 ]:
239 try:
240 eval(stmt, globals(), locals())
241 except TypeError:
242 pass
243 else:
244 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000245
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000246 # Check tuple re-use (implementation detail)
247 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
248 zip('abc', 'def'))
249 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
250 zip('abc', 'def'))
251 ids = map(id, izip_longest('abc', 'def'))
252 self.assertEqual(min(ids), max(ids))
253 ids = map(id, list(izip_longest('abc', 'def')))
254 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
255
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000256 def test_product(self):
257 for args, result in [
258 ([], []), # zero iterables ??? is this correct
259 (['ab'], [('a',), ('b',)]), # one iterable
260 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
261 ([range(0), range(2), range(3)], []), # first iterable with zero length
262 ([range(2), range(0), range(3)], []), # middle iterable with zero length
263 ([range(2), range(3), range(0)], []), # last iterable with zero length
264 ]:
265 self.assertEqual(list(product(*args)), result)
266 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
267 self.assertRaises(TypeError, product, range(6), None)
268 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
269 set('abcdefg'), range(11), tuple(range(13))]
270 for i in range(100):
271 args = [random.choice(argtypes) for j in range(random.randrange(5))]
272 n = reduce(operator.mul, map(len, args), 1) if args else 0
273 self.assertEqual(len(list(product(*args))), n)
274 args = map(iter, args)
275 self.assertEqual(len(list(product(*args))), n)
276
277
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000278 def test_repeat(self):
279 self.assertEqual(zip(xrange(3),repeat('a')),
280 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000281 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000282 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000283 self.assertEqual(list(repeat('a', 0)), [])
284 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000285 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000286 self.assertRaises(TypeError, repeat, None, 3, 4)
287 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000288 r = repeat(1+0j)
289 self.assertEqual(repr(r), 'repeat((1+0j))')
290 r = repeat(1+0j, 5)
291 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
292 list(r)
293 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000294
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000295 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000296 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
297 [0**1, 1**2, 2**3])
298 self.assertEqual(list(imap(None, 'abc', range(5))),
299 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000300 self.assertEqual(list(imap(None, 'abc', count())),
301 [('a',0),('b',1),('c',2)])
302 self.assertEqual(take(2,imap(None, 'abc', count())),
303 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000304 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000305 self.assertRaises(TypeError, imap)
306 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000307 self.assertRaises(TypeError, imap(10, range(5)).next)
308 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
309 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000310
311 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000312 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
313 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000314 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
315 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000316 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000317 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
318 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000319 self.assertRaises(TypeError, starmap)
320 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
321 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
322 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
323 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000324
325 def test_islice(self):
326 for args in [ # islice(args) should agree with range(args)
327 (10, 20, 3),
328 (10, 3, 20),
329 (10, 20),
330 (10, 3),
331 (20,)
332 ]:
333 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
334
335 for args, tgtargs in [ # Stop when seqn is exhausted
336 ((10, 110, 3), ((10, 100, 3))),
337 ((10, 110), ((10, 100))),
338 ((110,), (100,))
339 ]:
340 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
341
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000342 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000343 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000344 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
345 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000346 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
347 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
348
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000349 # Test number of items consumed SF #1171417
350 it = iter(range(10))
351 self.assertEqual(list(islice(it, 3)), range(3))
352 self.assertEqual(list(it), range(3, 10))
353
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000354 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000355 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000356 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
357 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
358 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
359 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
360 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000361 self.assertRaises(ValueError, islice, xrange(10), 'a')
362 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
363 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
364 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
365 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000366 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000367
368 def test_takewhile(self):
369 data = [1, 3, 5, 20, 2, 4, 6, 8]
370 underten = lambda x: x<10
371 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000372 self.assertEqual(list(takewhile(underten, [])), [])
373 self.assertRaises(TypeError, takewhile)
374 self.assertRaises(TypeError, takewhile, operator.pow)
375 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
376 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
377 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000378 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
379 self.assertEqual(list(t), [1, 1, 1])
380 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000381
382 def test_dropwhile(self):
383 data = [1, 3, 5, 20, 2, 4, 6, 8]
384 underten = lambda x: x<10
385 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000386 self.assertEqual(list(dropwhile(underten, [])), [])
387 self.assertRaises(TypeError, dropwhile)
388 self.assertRaises(TypeError, dropwhile, operator.pow)
389 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
390 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
391 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000392
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000393 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000394 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000395 def irange(n):
396 for i in xrange(n):
397 yield i
398
399 a, b = tee([]) # test empty iterator
400 self.assertEqual(list(a), [])
401 self.assertEqual(list(b), [])
402
403 a, b = tee(irange(n)) # test 100% interleaved
404 self.assertEqual(zip(a,b), zip(range(n),range(n)))
405
406 a, b = tee(irange(n)) # test 0% interleaved
407 self.assertEqual(list(a), range(n))
408 self.assertEqual(list(b), range(n))
409
410 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000411 for i in xrange(100):
412 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000413 del a
414 self.assertEqual(list(b), range(n))
415
416 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000417 for i in xrange(100):
418 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000419 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000420 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000421
422 for j in xrange(5): # test randomly interleaved
423 order = [0]*n + [1]*n
424 random.shuffle(order)
425 lists = ([], [])
426 its = tee(irange(n))
427 for i in order:
428 value = its[i].next()
429 lists[i].append(value)
430 self.assertEqual(lists[0], range(n))
431 self.assertEqual(lists[1], range(n))
432
Raymond Hettingerad983e72003-11-12 14:32:26 +0000433 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000434 self.assertRaises(TypeError, tee)
435 self.assertRaises(TypeError, tee, 3)
436 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000437 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000438
Raymond Hettingerad983e72003-11-12 14:32:26 +0000439 # tee object should be instantiable
440 a, b = tee('abc')
441 c = type(a)('def')
442 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000443
Raymond Hettingerad983e72003-11-12 14:32:26 +0000444 # test long-lagged and multi-way split
445 a, b, c = tee(xrange(2000), 3)
446 for i in xrange(100):
447 self.assertEqual(a.next(), i)
448 self.assertEqual(list(b), range(2000))
449 self.assertEqual([c.next(), c.next()], range(2))
450 self.assertEqual(list(a), range(100,2000))
451 self.assertEqual(list(c), range(2,2000))
452
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000453 # test values of n
454 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000455 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000456 for n in xrange(5):
457 result = tee('abc', n)
458 self.assertEqual(type(result), tuple)
459 self.assertEqual(len(result), n)
460 self.assertEqual(map(list, result), [list('abc')]*n)
461
Raymond Hettingerad983e72003-11-12 14:32:26 +0000462 # tee pass-through to copyable iterator
463 a, b = tee('abc')
464 c, d = tee(a)
465 self.assert_(a is c)
466
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000467 # test tee_new
468 t1, t2 = tee('abc')
469 tnew = type(t1)
470 self.assertRaises(TypeError, tnew)
471 self.assertRaises(TypeError, tnew, 10)
472 t3 = tnew(t1)
473 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000474
Raymond Hettingera9f60922004-10-17 16:40:14 +0000475 # test that tee objects are weak referencable
476 a, b = tee(xrange(10))
477 p = proxy(a)
478 self.assertEqual(getattr(p, '__class__'), type(b))
479 del a
480 self.assertRaises(ReferenceError, getattr, p, '__class__')
481
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000482 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000483 self.assertRaises(StopIteration, izip().next)
484
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000485 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000486 self.assertRaises(StopIteration, f([]).next)
487 self.assertRaises(StopIteration, f(StopNow()).next)
488
489 self.assertRaises(StopIteration, islice([], None).next)
490 self.assertRaises(StopIteration, islice(StopNow(), None).next)
491
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000492 p, q = tee([])
493 self.assertRaises(StopIteration, p.next)
494 self.assertRaises(StopIteration, q.next)
495 p, q = tee(StopNow())
496 self.assertRaises(StopIteration, p.next)
497 self.assertRaises(StopIteration, q.next)
498
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000499 self.assertRaises(StopIteration, repeat(None, 0).next)
500
501 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
502 self.assertRaises(StopIteration, f(lambda x:x, []).next)
503 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
504
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000505class TestGC(unittest.TestCase):
506
507 def makecycle(self, iterator, container):
508 container.append(iterator)
509 iterator.next()
510 del container, iterator
511
512 def test_chain(self):
513 a = []
514 self.makecycle(chain(a), a)
515
516 def test_cycle(self):
517 a = []
518 self.makecycle(cycle([a]*2), a)
519
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000520 def test_dropwhile(self):
521 a = []
522 self.makecycle(dropwhile(bool, [0, a, a]), a)
523
524 def test_groupby(self):
525 a = []
526 self.makecycle(groupby([a]*2, lambda x:x), a)
527
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000528 def test_ifilter(self):
529 a = []
530 self.makecycle(ifilter(lambda x:True, [a]*2), a)
531
532 def test_ifilterfalse(self):
533 a = []
534 self.makecycle(ifilterfalse(lambda x:False, a), a)
535
536 def test_izip(self):
537 a = []
538 self.makecycle(izip([a]*2, [a]*3), a)
539
540 def test_imap(self):
541 a = []
542 self.makecycle(imap(lambda x:x, [a]*2), a)
543
544 def test_islice(self):
545 a = []
546 self.makecycle(islice([a]*2, None), a)
547
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000548 def test_repeat(self):
549 a = []
550 self.makecycle(repeat(a), a)
551
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000552 def test_starmap(self):
553 a = []
554 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
555
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000556 def test_takewhile(self):
557 a = []
558 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
559
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000560def R(seqn):
561 'Regular generator'
562 for i in seqn:
563 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000564
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000565class G:
566 'Sequence using __getitem__'
567 def __init__(self, seqn):
568 self.seqn = seqn
569 def __getitem__(self, i):
570 return self.seqn[i]
571
572class I:
573 'Sequence using iterator protocol'
574 def __init__(self, seqn):
575 self.seqn = seqn
576 self.i = 0
577 def __iter__(self):
578 return self
579 def next(self):
580 if self.i >= len(self.seqn): raise StopIteration
581 v = self.seqn[self.i]
582 self.i += 1
583 return v
584
585class Ig:
586 'Sequence using iterator protocol defined with a generator'
587 def __init__(self, seqn):
588 self.seqn = seqn
589 self.i = 0
590 def __iter__(self):
591 for val in self.seqn:
592 yield val
593
594class X:
595 'Missing __getitem__ and __iter__'
596 def __init__(self, seqn):
597 self.seqn = seqn
598 self.i = 0
599 def next(self):
600 if self.i >= len(self.seqn): raise StopIteration
601 v = self.seqn[self.i]
602 self.i += 1
603 return v
604
605class N:
606 'Iterator missing next()'
607 def __init__(self, seqn):
608 self.seqn = seqn
609 self.i = 0
610 def __iter__(self):
611 return self
612
613class E:
614 'Test propagation of exceptions'
615 def __init__(self, seqn):
616 self.seqn = seqn
617 self.i = 0
618 def __iter__(self):
619 return self
620 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000621 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000622
623class S:
624 'Test immediate stop'
625 def __init__(self, seqn):
626 pass
627 def __iter__(self):
628 return self
629 def next(self):
630 raise StopIteration
631
632def L(seqn):
633 'Test multiple tiers of iterators'
634 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
635
636
637class TestVariousIteratorArgs(unittest.TestCase):
638
639 def test_chain(self):
640 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
641 for g in (G, I, Ig, S, L, R):
642 self.assertEqual(list(chain(g(s))), list(g(s)))
643 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
644 self.assertRaises(TypeError, chain, X(s))
645 self.assertRaises(TypeError, list, chain(N(s)))
646 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
647
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000648 def test_product(self):
649 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
650 self.assertRaises(TypeError, product, X(s))
651 self.assertRaises(TypeError, product, N(s))
652 self.assertRaises(ZeroDivisionError, product, E(s))
653
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000654 def test_cycle(self):
655 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
656 for g in (G, I, Ig, S, L, R):
657 tgtlen = len(s) * 3
658 expected = list(g(s))*3
659 actual = list(islice(cycle(g(s)), tgtlen))
660 self.assertEqual(actual, expected)
661 self.assertRaises(TypeError, cycle, X(s))
662 self.assertRaises(TypeError, list, cycle(N(s)))
663 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
664
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000665 def test_groupby(self):
666 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
667 for g in (G, I, Ig, S, L, R):
668 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
669 self.assertRaises(TypeError, groupby, X(s))
670 self.assertRaises(TypeError, list, groupby(N(s)))
671 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
672
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000673 def test_ifilter(self):
674 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
675 for g in (G, I, Ig, S, L, R):
676 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
677 self.assertRaises(TypeError, ifilter, isEven, X(s))
678 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
679 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
680
681 def test_ifilterfalse(self):
682 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
683 for g in (G, I, Ig, S, L, R):
684 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
685 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
686 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
687 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
688
689 def test_izip(self):
690 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
691 for g in (G, I, Ig, S, L, R):
692 self.assertEqual(list(izip(g(s))), zip(g(s)))
693 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
694 self.assertRaises(TypeError, izip, X(s))
695 self.assertRaises(TypeError, list, izip(N(s)))
696 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
697
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000698 def test_iziplongest(self):
699 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
700 for g in (G, I, Ig, S, L, R):
701 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
702 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
703 self.assertRaises(TypeError, izip_longest, X(s))
704 self.assertRaises(TypeError, list, izip_longest(N(s)))
705 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
706
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000707 def test_imap(self):
708 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
709 for g in (G, I, Ig, S, L, R):
710 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
711 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
712 self.assertRaises(TypeError, imap, onearg, X(s))
713 self.assertRaises(TypeError, list, imap(onearg, N(s)))
714 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
715
716 def test_islice(self):
717 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
718 for g in (G, I, Ig, S, L, R):
719 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
720 self.assertRaises(TypeError, islice, X(s), 10)
721 self.assertRaises(TypeError, list, islice(N(s), 10))
722 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
723
724 def test_starmap(self):
725 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
726 for g in (G, I, Ig, S, L, R):
727 ss = zip(s, s)
728 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
729 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
730 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
731 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
732
733 def test_takewhile(self):
734 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
735 for g in (G, I, Ig, S, L, R):
736 tgt = []
737 for elem in g(s):
738 if not isEven(elem): break
739 tgt.append(elem)
740 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
741 self.assertRaises(TypeError, takewhile, isEven, X(s))
742 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
743 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
744
745 def test_dropwhile(self):
746 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
747 for g in (G, I, Ig, S, L, R):
748 tgt = []
749 for elem in g(s):
750 if not tgt and isOdd(elem): continue
751 tgt.append(elem)
752 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
753 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
754 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
755 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
756
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000757 def test_tee(self):
758 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
759 for g in (G, I, Ig, S, L, R):
760 it1, it2 = tee(g(s))
761 self.assertEqual(list(it1), list(g(s)))
762 self.assertEqual(list(it2), list(g(s)))
763 self.assertRaises(TypeError, tee, X(s))
764 self.assertRaises(TypeError, list, tee(N(s))[0])
765 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
766
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000767class LengthTransparency(unittest.TestCase):
768
769 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000770 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000771 self.assertEqual(len(repeat(None, 50)), 50)
772 self.assertRaises(TypeError, len, repeat(None))
773
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000774class RegressionTests(unittest.TestCase):
775
776 def test_sf_793826(self):
777 # Fix Armin Rigo's successful efforts to wreak havoc
778
779 def mutatingtuple(tuple1, f, tuple2):
780 # this builds a tuple t which is a copy of tuple1,
781 # then calls f(t), then mutates t to be equal to tuple2
782 # (needs len(tuple1) == len(tuple2)).
783 def g(value, first=[1]):
784 if first:
785 del first[:]
786 f(z.next())
787 return value
788 items = list(tuple2)
789 items[1:1] = list(tuple1)
790 gen = imap(g, items)
791 z = izip(*[gen]*len(tuple1))
792 z.next()
793
794 def f(t):
795 global T
796 T = t
797 first[:] = list(T)
798
799 first = []
800 mutatingtuple((1,2,3), f, (4,5,6))
801 second = list(T)
802 self.assertEqual(first, second)
803
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000804
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000805 def test_sf_950057(self):
806 # Make sure that chain() and cycle() catch exceptions immediately
807 # rather than when shifting between input sources
808
809 def gen1():
810 hist.append(0)
811 yield 1
812 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000813 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000814 hist.append(2)
815
816 def gen2(x):
817 hist.append(3)
818 yield 2
819 hist.append(4)
820 if x:
821 raise StopIteration
822
823 hist = []
824 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
825 self.assertEqual(hist, [0,1])
826
827 hist = []
828 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
829 self.assertEqual(hist, [0,1])
830
831 hist = []
832 self.assertRaises(AssertionError, list, cycle(gen1()))
833 self.assertEqual(hist, [0,1])
834
Georg Brandlb84c1372007-01-21 10:28:43 +0000835class SubclassWithKwargsTest(unittest.TestCase):
836 def test_keywords_in_subclass(self):
837 # count is not subclassable...
838 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
839 starmap, islice, takewhile, dropwhile, cycle):
840 class Subclass(cls):
841 def __init__(self, newarg=None, *args):
842 cls.__init__(self, *args)
843 try:
844 Subclass(newarg=1)
845 except TypeError, err:
846 # we expect type errors because of wrong argument count
847 self.failIf("does not take keyword arguments" in err.args[0])
848
849
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000850libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000851
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000852
853>>> amounts = [120.15, 764.05, 823.14]
854>>> for checknum, amount in izip(count(1200), amounts):
855... print 'Check %d is for $%.2f' % (checknum, amount)
856...
857Check 1200 is for $120.15
858Check 1201 is for $764.05
859Check 1202 is for $823.14
860
861>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000862>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
863... print cube
864...
8651
8668
86727
868
869>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000870>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000871... print name.title()
872...
873Alex
874Laura
875Martin
876Walter
877Samuele
878
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000879>>> from operator import itemgetter
880>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000881>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000882>>> for k, g in groupby(di, itemgetter(1)):
883... print k, map(itemgetter(0), g)
884...
8851 ['a', 'c', 'e']
8862 ['b', 'd', 'f']
8873 ['g']
888
Raymond Hettinger734fb572004-01-20 20:04:40 +0000889# Find runs of consecutive numbers using groupby. The key to the solution
890# is differencing with a range so that consecutive numbers all appear in
891# same group.
892>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
893>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
894... print map(operator.itemgetter(1), g)
895...
896[1]
897[4, 5, 6]
898[10]
899[15, 16, 17, 18]
900[22]
901[25, 26, 27, 28]
902
Raymond Hettingera098b332003-09-08 23:58:40 +0000903>>> def take(n, seq):
904... return list(islice(seq, n))
905
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000906>>> def enumerate(iterable):
907... return izip(count(), iterable)
908
909>>> def tabulate(function):
910... "Return function(0), function(1), ..."
911... return imap(function, count())
912
913>>> def iteritems(mapping):
914... return izip(mapping.iterkeys(), mapping.itervalues())
915
916>>> def nth(iterable, n):
917... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000918... return list(islice(iterable, n, n+1))
919
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000920>>> def all(seq, pred=None):
921... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000922... for elem in ifilterfalse(pred, seq):
923... return False
924... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000925
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000926>>> def any(seq, pred=None):
927... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000928... for elem in ifilter(pred, seq):
929... return True
930... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000931
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000932>>> def no(seq, pred=None):
933... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000934... for elem in ifilter(pred, seq):
935... return False
936... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000937
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000938>>> def quantify(seq, pred=None):
939... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000940... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000941
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000942>>> def padnone(seq):
943... "Returns the sequence elements and then returns None indefinitely"
944... return chain(seq, repeat(None))
945
946>>> def ncycles(seq, n):
947... "Returns the sequence elements n times"
948... return chain(*repeat(seq, n))
949
950>>> def dotproduct(vec1, vec2):
951... return sum(imap(operator.mul, vec1, vec2))
952
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000953>>> def flatten(listOfLists):
954... return list(chain(*listOfLists))
955
956>>> def repeatfunc(func, times=None, *args):
957... "Repeat calls to func with specified arguments."
958... " Example: repeatfunc(random.random)"
959... if times is None:
960... return starmap(func, repeat(args))
961... else:
962... return starmap(func, repeat(args, times))
963
Raymond Hettingerd591f662003-10-26 15:34:50 +0000964>>> def pairwise(iterable):
965... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
966... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000967... try:
968... b.next()
969... except StopIteration:
970... pass
971... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000972
973This is not part of the examples but it tests to make sure the definitions
974perform as purported.
975
Raymond Hettingera098b332003-09-08 23:58:40 +0000976>>> take(10, count())
977[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
978
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000979>>> list(enumerate('abc'))
980[(0, 'a'), (1, 'b'), (2, 'c')]
981
982>>> list(islice(tabulate(lambda x: 2*x), 4))
983[0, 2, 4, 6]
984
985>>> nth('abcde', 3)
986['d']
987
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000988>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000989True
990
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000991>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000992False
993
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000994>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000995True
996
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000997>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000998False
999
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001000>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001001True
1002
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001003>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001004False
1005
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001006>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000100750
1008
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001009>>> a = [[1, 2, 3], [4, 5, 6]]
1010>>> flatten(a)
1011[1, 2, 3, 4, 5, 6]
1012
1013>>> list(repeatfunc(pow, 5, 2, 3))
1014[8, 8, 8, 8, 8]
1015
1016>>> import random
1017>>> take(5, imap(int, repeatfunc(random.random)))
1018[0, 0, 0, 0, 0]
1019
Raymond Hettingerd591f662003-10-26 15:34:50 +00001020>>> list(pairwise('abcd'))
1021[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001022
Raymond Hettingerd591f662003-10-26 15:34:50 +00001023>>> list(pairwise([]))
1024[]
1025
1026>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001027[]
1028
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001029>>> list(islice(padnone('abc'), 0, 6))
1030['a', 'b', 'c', None, None, None]
1031
1032>>> list(ncycles('abc', 3))
1033['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1034
1035>>> dotproduct([1,2,3], [4,5,6])
103632
1037
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001038"""
1039
1040__test__ = {'libreftest' : libreftest}
1041
1042def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001043 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001044 RegressionTests, LengthTransparency,
1045 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001046 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001047
1048 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001049 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001050 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001051 counts = [None] * 5
1052 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001053 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001054 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001055 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001056 print counts
1057
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001058 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001059 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001060
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001061if __name__ == "__main__":
1062 test_main(verbose=True)