1import unittest 2from test import test_support 3from itertools import * 4import weakref 5from decimal import Decimal 6from fractions import Fraction 7import sys 8import operator 9import random 10import copy 11import pickle 12from functools import reduce 13maxsize = test_support.MAX_Py_ssize_t 14minsize = -maxsize-1 15 16def onearg(x): 17 'Test function of one argument' 18 return 2*x 19 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 33def isOdd(x): 34 'Test predicate' 35 return x%2==1 36 37class StopNow: 38 'Class emulating an empty iterable.' 39 def __iter__(self): 40 return self 41 def next(self): 42 raise StopIteration 43 44def take(n, seq): 45 'Convenience function for partially consuming a long of infinite iterable' 46 return list(islice(seq, n)) 47 48def prod(iterable): 49 return reduce(operator.mul, iterable, 1) 50 51def fact(n): 52 'Factorial' 53 return prod(range(1, n+1)) 54 55class TestBasicOps(unittest.TestCase): 56 def test_chain(self): 57 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)) 70 71 def test_chain_from_iterable(self): 72 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef')) 73 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc')) 74 self.assertEqual(list(chain.from_iterable([''])), []) 75 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd')) 76 self.assertRaises(TypeError, list, chain.from_iterable([2, 3])) 77 78 def test_combinations(self): 79 self.assertRaises(TypeError, combinations, 'abc') # missing r argument 80 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments 81 self.assertRaises(TypeError, combinations, None) # pool is not iterable 82 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative 83 self.assertEqual(list(combinations('abc', 32)), []) # r > n 84 self.assertEqual(list(combinations(range(4), 3)), 85 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)]) 86 87 def combinations1(iterable, r): 88 'Pure python version shown in the docs' 89 pool = tuple(iterable) 90 n = len(pool) 91 if r > n: 92 return 93 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 114 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 122 for n in range(7): 123 values = [5*x-12 for x in range(n)] 124 for r in range(n+2): 125 result = list(combinations(values, r)) 126 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(r) // fact(n-r)) # right number of combs 127 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 133 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable 134 self.assertEqual(list(c), 135 [e for e in values if e in c]) # comb is a subsequence of the input iterable 136 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version 137 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version 138 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version 139 140 @test_support.bigaddrspacetest 141 def test_combinations_overflow(self): 142 with self.assertRaises((OverflowError, MemoryError)): 143 combinations("AA", 2**29) 144 145 @test_support.impl_detail("tuple reuse is specific to CPython") 146 def test_combinations_tuple_reuse(self): 147 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1) 148 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1) 149 150 def test_combinations_with_replacement(self): 151 cwr = combinations_with_replacement 152 self.assertRaises(TypeError, cwr, 'abc') # missing r argument 153 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments 154 self.assertRaises(TypeError, cwr, None) # pool is not iterable 155 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative 156 self.assertEqual(list(cwr('ABC', 2)), 157 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')]) 158 159 def cwr1(iterable, r): 160 'Pure python version shown in the docs' 161 # number items returned: (n+r-1)! / r! / (n-1)! when n>0 162 pool = tuple(iterable) 163 n = len(pool) 164 if not n and r: 165 return 166 indices = [0] * r 167 yield tuple(pool[i] for i in indices) 168 while 1: 169 for i in reversed(range(r)): 170 if indices[i] != n - 1: 171 break 172 else: 173 return 174 indices[i:] = [indices[i] + 1] * (r - i) 175 yield tuple(pool[i] for i in indices) 176 177 def cwr2(iterable, r): 178 'Pure python version shown in the docs' 179 pool = tuple(iterable) 180 n = len(pool) 181 for indices in product(range(n), repeat=r): 182 if sorted(indices) == list(indices): 183 yield tuple(pool[i] for i in indices) 184 185 def numcombs(n, r): 186 if not n: 187 return 0 if r else 1 188 return fact(n+r-1) // fact(r) // fact(n-1) 189 190 for n in range(7): 191 values = [5*x-12 for x in range(n)] 192 for r in range(n+2): 193 result = list(cwr(values, r)) 194 195 self.assertEqual(len(result), numcombs(n, r)) # right number of combs 196 self.assertEqual(len(result), len(set(result))) # no repeats 197 self.assertEqual(result, sorted(result)) # lexicographic order 198 199 regular_combs = list(combinations(values, r)) # compare to combs without replacement 200 if n == 0 or r <= 1: 201 self.assertEqual(result, regular_combs) # cases that should be identical 202 else: 203 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs 204 205 for c in result: 206 self.assertEqual(len(c), r) # r-length combinations 207 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats 208 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive 209 self.assertEqual(list(c), sorted(c)) # keep original ordering 210 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable 211 self.assertEqual(noruns, 212 [e for e in values if e in c]) # comb is a subsequence of the input iterable 213 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version 214 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version 215 216 @test_support.bigaddrspacetest 217 def test_combinations_with_replacement_overflow(self): 218 with self.assertRaises((OverflowError, MemoryError)): 219 combinations_with_replacement("AA", 2**30) 220 221 @test_support.impl_detail("tuple reuse is specific to CPython") 222 def test_combinations_with_replacement_tuple_reuse(self): 223 cwr = combinations_with_replacement 224 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1) 225 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1) 226 227 def test_permutations(self): 228 self.assertRaises(TypeError, permutations) # too few arguments 229 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments 230 self.assertRaises(TypeError, permutations, None) # pool is not iterable 231 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative 232 self.assertEqual(list(permutations('abc', 32)), []) # r > n 233 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None 234 self.assertEqual(list(permutations(range(3), 2)), 235 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)]) 236 237 def permutations1(iterable, r=None): 238 'Pure python version shown in the docs' 239 pool = tuple(iterable) 240 n = len(pool) 241 r = n if r is None else r 242 if r > n: 243 return 244 indices = range(n) 245 cycles = range(n, n-r, -1) 246 yield tuple(pool[i] for i in indices[:r]) 247 while n: 248 for i in reversed(range(r)): 249 cycles[i] -= 1 250 if cycles[i] == 0: 251 indices[i:] = indices[i+1:] + indices[i:i+1] 252 cycles[i] = n - i 253 else: 254 j = cycles[i] 255 indices[i], indices[-j] = indices[-j], indices[i] 256 yield tuple(pool[i] for i in indices[:r]) 257 break 258 else: 259 return 260 261 def permutations2(iterable, r=None): 262 'Pure python version shown in the docs' 263 pool = tuple(iterable) 264 n = len(pool) 265 r = n if r is None else r 266 for indices in product(range(n), repeat=r): 267 if len(set(indices)) == r: 268 yield tuple(pool[i] for i in indices) 269 270 for n in range(7): 271 values = [5*x-12 for x in range(n)] 272 for r in range(n+2): 273 result = list(permutations(values, r)) 274 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(n-r)) # right number of perms 275 self.assertEqual(len(result), len(set(result))) # no repeats 276 self.assertEqual(result, sorted(result)) # lexicographic order 277 for p in result: 278 self.assertEqual(len(p), r) # r-length permutations 279 self.assertEqual(len(set(p)), r) # no duplicate elements 280 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable 281 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version 282 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version 283 if r == n: 284 self.assertEqual(result, list(permutations(values, None))) # test r as None 285 self.assertEqual(result, list(permutations(values))) # test default r 286 287 @test_support.bigaddrspacetest 288 def test_permutations_overflow(self): 289 with self.assertRaises((OverflowError, MemoryError)): 290 permutations("A", 2**30) 291 292 @test_support.impl_detail("tuple reuse is specific to CPython") 293 def test_permutations_tuple_reuse(self): 294 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1) 295 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1) 296 297 def test_combinatorics(self): 298 # Test relationships between product(), permutations(), 299 # combinations() and combinations_with_replacement(). 300 301 for n in range(6): 302 s = 'ABCDEFG'[:n] 303 for r in range(8): 304 prod = list(product(s, repeat=r)) 305 cwr = list(combinations_with_replacement(s, r)) 306 perm = list(permutations(s, r)) 307 comb = list(combinations(s, r)) 308 309 # Check size 310 self.assertEqual(len(prod), n**r) 311 self.assertEqual(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r)) 312 self.assertEqual(len(perm), 0 if r>n else fact(n) // fact(n-r)) 313 self.assertEqual(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r)) 314 315 # Check lexicographic order without repeated tuples 316 self.assertEqual(prod, sorted(set(prod))) 317 self.assertEqual(cwr, sorted(set(cwr))) 318 self.assertEqual(perm, sorted(set(perm))) 319 self.assertEqual(comb, sorted(set(comb))) 320 321 # Check interrelationships 322 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted 323 self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups 324 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted 325 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups 326 self.assertEqual(comb, filter(set(cwr).__contains__, perm)) # comb: perm that is a cwr 327 self.assertEqual(comb, filter(set(perm).__contains__, cwr)) # comb: cwr that is a perm 328 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm 329 330 def test_compress(self): 331 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF')) 332 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF')) 333 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list('')) 334 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF')) 335 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC')) 336 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC')) 337 n = 10000 338 data = chain.from_iterable(repeat(range(6), n)) 339 selectors = chain.from_iterable(repeat((0, 1))) 340 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n) 341 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable 342 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable 343 self.assertRaises(TypeError, compress, range(6)) # too few args 344 self.assertRaises(TypeError, compress, range(6), None) # too many args 345 346 def test_count(self): 347 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)]) 348 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)]) 349 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)]) 350 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)]) 351 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)]) 352 self.assertRaises(TypeError, count, 2, 3, 4) 353 self.assertRaises(TypeError, count, 'a') 354 self.assertEqual(take(10, count(maxsize-5)), range(maxsize-5, maxsize+5)) 355 self.assertEqual(take(10, count(-maxsize-5)), range(-maxsize-5, -maxsize+5)) 356 self.assertEqual(take(3, count(3.25)), [3.25, 4.25, 5.25]) 357 self.assertEqual(take(3, count(3.25-4j)), [3.25-4j, 4.25-4j, 5.25-4j]) 358 self.assertEqual(take(3, count(Decimal('1.1'))), 359 [Decimal('1.1'), Decimal('2.1'), Decimal('3.1')]) 360 self.assertEqual(take(3, count(Fraction(2, 3))), 361 [Fraction(2, 3), Fraction(5, 3), Fraction(8, 3)]) 362 BIGINT = 1<<1000 363 self.assertEqual(take(3, count(BIGINT)), [BIGINT, BIGINT+1, BIGINT+2]) 364 c = count(3) 365 self.assertEqual(repr(c), 'count(3)') 366 c.next() 367 self.assertEqual(repr(c), 'count(4)') 368 c = count(-9) 369 self.assertEqual(repr(c), 'count(-9)') 370 c.next() 371 self.assertEqual(next(c), -8) 372 self.assertEqual(repr(count(10.25)), 'count(10.25)') 373 self.assertEqual(repr(count(10.0)), 'count(10.0)') 374 self.assertEqual(type(next(count(10.0))), float) 375 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5): 376 # Test repr (ignoring the L in longs) 377 r1 = repr(count(i)).replace('L', '') 378 r2 = 'count(%r)'.__mod__(i).replace('L', '') 379 self.assertEqual(r1, r2) 380 381 # check copy, deepcopy, pickle 382 for value in -3, 3, sys.maxint-5, sys.maxint+5: 383 c = count(value) 384 self.assertEqual(next(copy.copy(c)), value) 385 self.assertEqual(next(copy.deepcopy(c)), value) 386 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 387 self.assertEqual(next(pickle.loads(pickle.dumps(c, proto))), value) 388 389 def test_count_with_stride(self): 390 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)]) 391 self.assertEqual(zip('abc',count(start=2,step=3)), 392 [('a', 2), ('b', 5), ('c', 8)]) 393 self.assertEqual(zip('abc',count(step=-1)), 394 [('a', 0), ('b', -1), ('c', -2)]) 395 self.assertRaises(TypeError, count, 'a', 'b') 396 self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)]) 397 self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)]) 398 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)]) 399 self.assertEqual(zip('abc',count(2,1L)), [('a', 2), ('b', 3), ('c', 4)]) 400 self.assertEqual(zip('abc',count(2,3L)), [('a', 2), ('b', 5), ('c', 8)]) 401 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3))) 402 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3))) 403 self.assertEqual(take(3, count(10, maxsize+5)), 404 range(10, 10+3*(maxsize+5), maxsize+5)) 405 self.assertEqual(take(3, count(2, 1.25)), [2, 3.25, 4.5]) 406 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j]) 407 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))), 408 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')]) 409 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))), 410 [Fraction(2,3), Fraction(17,21), Fraction(20,21)]) 411 BIGINT = 1<<1000 412 self.assertEqual(take(3, count(step=BIGINT)), [0, BIGINT, 2*BIGINT]) 413 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0])) 414 c = count(3, 5) 415 self.assertEqual(repr(c), 'count(3, 5)') 416 c.next() 417 self.assertEqual(repr(c), 'count(8, 5)') 418 c = count(-9, 0) 419 self.assertEqual(repr(c), 'count(-9, 0)') 420 c.next() 421 self.assertEqual(repr(c), 'count(-9, 0)') 422 c = count(-9, -3) 423 self.assertEqual(repr(c), 'count(-9, -3)') 424 c.next() 425 self.assertEqual(repr(c), 'count(-12, -3)') 426 self.assertEqual(repr(c), 'count(-12, -3)') 427 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)') 428 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int 429 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0 430 self.assertEqual(repr(count(10, 1.00)), 'count(10, 1.0)') 431 c = count(10, 1.0) 432 self.assertEqual(type(next(c)), int) 433 self.assertEqual(type(next(c)), float) 434 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5): 435 for j in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5): 436 # Test repr (ignoring the L in longs) 437 r1 = repr(count(i, j)).replace('L', '') 438 if j == 1: 439 r2 = ('count(%r)' % i).replace('L', '') 440 else: 441 r2 = ('count(%r, %r)' % (i, j)).replace('L', '') 442 self.assertEqual(r1, r2) 443 444 def test_cycle(self): 445 self.assertEqual(take(10, cycle('abc')), list('abcabcabca')) 446 self.assertEqual(list(cycle('')), []) 447 self.assertRaises(TypeError, cycle) 448 self.assertRaises(TypeError, cycle, 5) 449 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0]) 450 451 def test_groupby(self): 452 # Check whether it accepts arguments correctly 453 self.assertEqual([], list(groupby([]))) 454 self.assertEqual([], list(groupby([], key=id))) 455 self.assertRaises(TypeError, list, groupby('abc', [])) 456 self.assertRaises(TypeError, groupby, None) 457 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10) 458 459 # Check normal input 460 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22), 461 (2,15,22), (3,16,23), (3,17,23)] 462 dup = [] 463 for k, g in groupby(s, lambda r:r[0]): 464 for elem in g: 465 self.assertEqual(k, elem[0]) 466 dup.append(elem) 467 self.assertEqual(s, dup) 468 469 # Check nested case 470 dup = [] 471 for k, g in groupby(s, lambda r:r[0]): 472 for ik, ig in groupby(g, lambda r:r[2]): 473 for elem in ig: 474 self.assertEqual(k, elem[0]) 475 self.assertEqual(ik, elem[2]) 476 dup.append(elem) 477 self.assertEqual(s, dup) 478 479 # Check case where inner iterator is not used 480 keys = [k for k, g in groupby(s, lambda r:r[0])] 481 expectedkeys = set([r[0] for r in s]) 482 self.assertEqual(set(keys), expectedkeys) 483 self.assertEqual(len(keys), len(expectedkeys)) 484 485 # Exercise pipes and filters style 486 s = 'abracadabra' 487 # sort s | uniq 488 r = [k for k, g in groupby(sorted(s))] 489 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r']) 490 # sort s | uniq -d 491 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))] 492 self.assertEqual(r, ['a', 'b', 'r']) 493 # sort s | uniq -c 494 r = [(len(list(g)), k) for k, g in groupby(sorted(s))] 495 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')]) 496 # sort s | uniq -c | sort -rn | head -3 497 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3] 498 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')]) 499 500 # iter.next failure 501 class ExpectedError(Exception): 502 pass 503 def delayed_raise(n=0): 504 for i in range(n): 505 yield 'yo' 506 raise ExpectedError 507 def gulp(iterable, keyp=None, func=list): 508 return [func(g) for k, g in groupby(iterable, keyp)] 509 510 # iter.next failure on outer object 511 self.assertRaises(ExpectedError, gulp, delayed_raise(0)) 512 # iter.next failure on inner object 513 self.assertRaises(ExpectedError, gulp, delayed_raise(1)) 514 515 # __cmp__ failure 516 class DummyCmp: 517 def __cmp__(self, dst): 518 raise ExpectedError 519 s = [DummyCmp(), DummyCmp(), None] 520 521 # __cmp__ failure on outer object 522 self.assertRaises(ExpectedError, gulp, s, func=id) 523 # __cmp__ failure on inner object 524 self.assertRaises(ExpectedError, gulp, s) 525 526 # keyfunc failure 527 def keyfunc(obj): 528 if keyfunc.skip > 0: 529 keyfunc.skip -= 1 530 return obj 531 else: 532 raise ExpectedError 533 534 # keyfunc failure on outer object 535 keyfunc.skip = 0 536 self.assertRaises(ExpectedError, gulp, [None], keyfunc) 537 keyfunc.skip = 1 538 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc) 539 540 def test_ifilter(self): 541 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4]) 542 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2]) 543 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2]) 544 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6]) 545 self.assertRaises(TypeError, ifilter) 546 self.assertRaises(TypeError, ifilter, lambda x:x) 547 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7) 548 self.assertRaises(TypeError, ifilter, isEven, 3) 549 self.assertRaises(TypeError, ifilter(range(6), range(6)).next) 550 551 def test_ifilterfalse(self): 552 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5]) 553 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0]) 554 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0]) 555 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7]) 556 self.assertRaises(TypeError, ifilterfalse) 557 self.assertRaises(TypeError, ifilterfalse, lambda x:x) 558 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7) 559 self.assertRaises(TypeError, ifilterfalse, isEven, 3) 560 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next) 561 562 def test_izip(self): 563 ans = [(x,y) for x, y in izip('abc',count())] 564 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) 565 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6))) 566 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3))) 567 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3))) 568 self.assertEqual(list(izip('abcdef')), zip('abcdef')) 569 self.assertEqual(list(izip()), zip()) 570 self.assertRaises(TypeError, izip, 3) 571 self.assertRaises(TypeError, izip, range(3), 3) 572 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')], 573 zip('abc', 'def')) 574 self.assertEqual([pair for pair in izip('abc', 'def')], 575 zip('abc', 'def')) 576 577 @test_support.impl_detail("tuple reuse is specific to CPython") 578 def test_izip_tuple_reuse(self): 579 ids = map(id, izip('abc', 'def')) 580 self.assertEqual(min(ids), max(ids)) 581 ids = map(id, list(izip('abc', 'def'))) 582 self.assertEqual(len(dict.fromkeys(ids)), len(ids)) 583 584 def test_iziplongest(self): 585 for args in [ 586 ['abc', range(6)], 587 [range(6), 'abc'], 588 [range(1000), range(2000,2100), range(3000,3050)], 589 [range(1000), range(0), range(3000,3050), range(1200), range(1500)], 590 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)], 591 ]: 592 # target = map(None, *args) <- this raises a py3k warning 593 # this is the replacement: 594 target = [tuple([arg[i] if i < len(arg) else None for arg in args]) 595 for i in range(max(map(len, args)))] 596 self.assertEqual(list(izip_longest(*args)), target) 597 self.assertEqual(list(izip_longest(*args, **{})), target) 598 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X' 599 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target) 600 601 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input 602 603 self.assertEqual(list(izip_longest()), zip()) 604 self.assertEqual(list(izip_longest([])), zip([])) 605 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef')) 606 607 self.assertEqual(list(izip_longest('abc', 'defg', **{})), 608 zip(list('abc') + [None], 'defg')) # empty keyword dict 609 self.assertRaises(TypeError, izip_longest, 3) 610 self.assertRaises(TypeError, izip_longest, range(3), 3) 611 612 for stmt in [ 613 "izip_longest('abc', fv=1)", 614 "izip_longest('abc', fillvalue=1, bogus_keyword=None)", 615 ]: 616 try: 617 eval(stmt, globals(), locals()) 618 except TypeError: 619 pass 620 else: 621 self.fail('Did not raise Type in: ' + stmt) 622 623 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')], 624 zip('abc', 'def')) 625 self.assertEqual([pair for pair in izip_longest('abc', 'def')], 626 zip('abc', 'def')) 627 628 @test_support.impl_detail("tuple reuse is specific to CPython") 629 def test_izip_longest_tuple_reuse(self): 630 ids = map(id, izip_longest('abc', 'def')) 631 self.assertEqual(min(ids), max(ids)) 632 ids = map(id, list(izip_longest('abc', 'def'))) 633 self.assertEqual(len(dict.fromkeys(ids)), len(ids)) 634 635 def test_bug_7244(self): 636 637 class Repeater(object): 638 # this class is similar to itertools.repeat 639 def __init__(self, o, t, e): 640 self.o = o 641 self.t = int(t) 642 self.e = e 643 def __iter__(self): # its iterator is itself 644 return self 645 def next(self): 646 if self.t > 0: 647 self.t -= 1 648 return self.o 649 else: 650 raise self.e 651 652 # Formerly this code in would fail in debug mode 653 # with Undetected Error and Stop Iteration 654 r1 = Repeater(1, 3, StopIteration) 655 r2 = Repeater(2, 4, StopIteration) 656 def run(r1, r2): 657 result = [] 658 for i, j in izip_longest(r1, r2, fillvalue=0): 659 with test_support.captured_output('stdout'): 660 print (i, j) 661 result.append((i, j)) 662 return result 663 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)]) 664 665 # Formerly, the RuntimeError would be lost 666 # and StopIteration would stop as expected 667 r1 = Repeater(1, 3, RuntimeError) 668 r2 = Repeater(2, 4, StopIteration) 669 it = izip_longest(r1, r2, fillvalue=0) 670 self.assertEqual(next(it), (1, 2)) 671 self.assertEqual(next(it), (1, 2)) 672 self.assertEqual(next(it), (1, 2)) 673 self.assertRaises(RuntimeError, next, it) 674 675 def test_product(self): 676 for args, result in [ 677 ([], [()]), # zero iterables 678 (['ab'], [('a',), ('b',)]), # one iterable 679 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables 680 ([range(0), range(2), range(3)], []), # first iterable with zero length 681 ([range(2), range(0), range(3)], []), # middle iterable with zero length 682 ([range(2), range(3), range(0)], []), # last iterable with zero length 683 ]: 684 self.assertEqual(list(product(*args)), result) 685 for r in range(4): 686 self.assertEqual(list(product(*(args*r))), 687 list(product(*args, **dict(repeat=r)))) 688 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6) 689 self.assertRaises(TypeError, product, range(6), None) 690 691 def product1(*args, **kwds): 692 pools = map(tuple, args) * kwds.get('repeat', 1) 693 n = len(pools) 694 if n == 0: 695 yield () 696 return 697 if any(len(pool) == 0 for pool in pools): 698 return 699 indices = [0] * n 700 yield tuple(pool[i] for pool, i in zip(pools, indices)) 701 while 1: 702 for i in reversed(range(n)): # right to left 703 if indices[i] == len(pools[i]) - 1: 704 continue 705 indices[i] += 1 706 for j in range(i+1, n): 707 indices[j] = 0 708 yield tuple(pool[i] for pool, i in zip(pools, indices)) 709 break 710 else: 711 return 712 713 def product2(*args, **kwds): 714 'Pure python version used in docs' 715 pools = map(tuple, args) * kwds.get('repeat', 1) 716 result = [[]] 717 for pool in pools: 718 result = [x+[y] for x in result for y in pool] 719 for prod in result: 720 yield tuple(prod) 721 722 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3), 723 set('abcdefg'), range(11), tuple(range(13))] 724 for i in range(100): 725 args = [random.choice(argtypes) for j in range(random.randrange(5))] 726 expected_len = prod(map(len, args)) 727 self.assertEqual(len(list(product(*args))), expected_len) 728 self.assertEqual(list(product(*args)), list(product1(*args))) 729 self.assertEqual(list(product(*args)), list(product2(*args))) 730 args = map(iter, args) 731 self.assertEqual(len(list(product(*args))), expected_len) 732 733 @test_support.bigaddrspacetest 734 def test_product_overflow(self): 735 with self.assertRaises((OverflowError, MemoryError)): 736 product(*(['ab']*2**5), repeat=2**25) 737 738 @test_support.impl_detail("tuple reuse is specific to CPython") 739 def test_product_tuple_reuse(self): 740 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1) 741 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1) 742 743 def test_repeat(self): 744 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a']) 745 self.assertEqual(list(repeat(object='a', times=0)), []) 746 self.assertEqual(list(repeat(object='a', times=-1)), []) 747 self.assertEqual(list(repeat(object='a', times=-2)), []) 748 self.assertEqual(zip(xrange(3),repeat('a')), 749 [(0, 'a'), (1, 'a'), (2, 'a')]) 750 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a']) 751 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a']) 752 self.assertEqual(list(repeat('a', 0)), []) 753 self.assertEqual(list(repeat('a', -3)), []) 754 self.assertRaises(TypeError, repeat) 755 self.assertRaises(TypeError, repeat, None, 3, 4) 756 self.assertRaises(TypeError, repeat, None, 'a') 757 r = repeat(1+0j) 758 self.assertEqual(repr(r), 'repeat((1+0j))') 759 r = repeat(1+0j, 5) 760 self.assertEqual(repr(r), 'repeat((1+0j), 5)') 761 list(r) 762 self.assertEqual(repr(r), 'repeat((1+0j), 0)') 763 764 def test_repeat_with_negative_times(self): 765 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)") 766 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)") 767 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)") 768 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)") 769 770 def test_imap(self): 771 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))), 772 [0**1, 1**2, 2**3]) 773 self.assertEqual(list(imap(None, 'abc', range(5))), 774 [('a',0),('b',1),('c',2)]) 775 self.assertEqual(list(imap(None, 'abc', count())), 776 [('a',0),('b',1),('c',2)]) 777 self.assertEqual(take(2,imap(None, 'abc', count())), 778 [('a',0),('b',1)]) 779 self.assertEqual(list(imap(operator.pow, [])), []) 780 self.assertRaises(TypeError, imap) 781 self.assertRaises(TypeError, imap, operator.neg) 782 self.assertRaises(TypeError, imap(10, range(5)).next) 783 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next) 784 self.assertRaises(TypeError, imap(onearg, [4], [5]).next) 785 786 def test_starmap(self): 787 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))), 788 [0**1, 1**2, 2**3]) 789 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))), 790 [0**1, 1**2, 2**3]) 791 self.assertEqual(list(starmap(operator.pow, [])), []) 792 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5]) 793 self.assertRaises(TypeError, list, starmap(operator.pow, [None])) 794 self.assertRaises(TypeError, starmap) 795 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra') 796 self.assertRaises(TypeError, starmap(10, [(4,5)]).next) 797 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next) 798 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next) 799 800 def test_islice(self): 801 for args in [ # islice(args) should agree with range(args) 802 (10, 20, 3), 803 (10, 3, 20), 804 (10, 20), 805 (10, 3), 806 (20,) 807 ]: 808 self.assertEqual(list(islice(xrange(100), *args)), range(*args)) 809 810 for args, tgtargs in [ # Stop when seqn is exhausted 811 ((10, 110, 3), ((10, 100, 3))), 812 ((10, 110), ((10, 100))), 813 ((110,), (100,)) 814 ]: 815 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs)) 816 817 # Test stop=None 818 self.assertEqual(list(islice(xrange(10), None)), range(10)) 819 self.assertEqual(list(islice(xrange(10), None, None)), range(10)) 820 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10)) 821 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10)) 822 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2)) 823 824 # Test number of items consumed SF #1171417 825 it = iter(range(10)) 826 self.assertEqual(list(islice(it, 3)), range(3)) 827 self.assertEqual(list(it), range(3, 10)) 828 829 # Test invalid arguments 830 self.assertRaises(TypeError, islice, xrange(10)) 831 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4) 832 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1) 833 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1) 834 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1) 835 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0) 836 self.assertRaises(ValueError, islice, xrange(10), 'a') 837 self.assertRaises(ValueError, islice, xrange(10), 'a', 1) 838 self.assertRaises(ValueError, islice, xrange(10), 1, 'a') 839 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1) 840 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1) 841 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1) 842 843 # Issue #10323: Less islice in a predictable state 844 c = count() 845 self.assertEqual(list(islice(c, 1, 3, 50)), [1]) 846 self.assertEqual(next(c), 3) 847 848 # Issue #21321: check source iterator is not referenced 849 # from islice() after the latter has been exhausted 850 it = (x for x in (1, 2)) 851 wr = weakref.ref(it) 852 it = islice(it, 1) 853 self.assertIsNotNone(wr()) 854 list(it) # exhaust the iterator 855 test_support.gc_collect() 856 self.assertIsNone(wr()) 857 858 def test_takewhile(self): 859 data = [1, 3, 5, 20, 2, 4, 6, 8] 860 underten = lambda x: x<10 861 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5]) 862 self.assertEqual(list(takewhile(underten, [])), []) 863 self.assertRaises(TypeError, takewhile) 864 self.assertRaises(TypeError, takewhile, operator.pow) 865 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra') 866 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next) 867 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next) 868 t = takewhile(bool, [1, 1, 1, 0, 0, 0]) 869 self.assertEqual(list(t), [1, 1, 1]) 870 self.assertRaises(StopIteration, t.next) 871 872 def test_dropwhile(self): 873 data = [1, 3, 5, 20, 2, 4, 6, 8] 874 underten = lambda x: x<10 875 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8]) 876 self.assertEqual(list(dropwhile(underten, [])), []) 877 self.assertRaises(TypeError, dropwhile) 878 self.assertRaises(TypeError, dropwhile, operator.pow) 879 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra') 880 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next) 881 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next) 882 883 def test_tee(self): 884 n = 200 885 def irange(n): 886 for i in xrange(n): 887 yield i 888 889 a, b = tee([]) # test empty iterator 890 self.assertEqual(list(a), []) 891 self.assertEqual(list(b), []) 892 893 a, b = tee(irange(n)) # test 100% interleaved 894 self.assertEqual(zip(a,b), zip(range(n),range(n))) 895 896 a, b = tee(irange(n)) # test 0% interleaved 897 self.assertEqual(list(a), range(n)) 898 self.assertEqual(list(b), range(n)) 899 900 a, b = tee(irange(n)) # test dealloc of leading iterator 901 for i in xrange(100): 902 self.assertEqual(a.next(), i) 903 del a 904 self.assertEqual(list(b), range(n)) 905 906 a, b = tee(irange(n)) # test dealloc of trailing iterator 907 for i in xrange(100): 908 self.assertEqual(a.next(), i) 909 del b 910 self.assertEqual(list(a), range(100, n)) 911 912 for j in xrange(5): # test randomly interleaved 913 order = [0]*n + [1]*n 914 random.shuffle(order) 915 lists = ([], []) 916 its = tee(irange(n)) 917 for i in order: 918 value = its[i].next() 919 lists[i].append(value) 920 self.assertEqual(lists[0], range(n)) 921 self.assertEqual(lists[1], range(n)) 922 923 # test argument format checking 924 self.assertRaises(TypeError, tee) 925 self.assertRaises(TypeError, tee, 3) 926 self.assertRaises(TypeError, tee, [1,2], 'x') 927 self.assertRaises(TypeError, tee, [1,2], 3, 'x') 928 929 # tee object should be instantiable 930 a, b = tee('abc') 931 c = type(a)('def') 932 self.assertEqual(list(c), list('def')) 933 934 # test long-lagged and multi-way split 935 a, b, c = tee(xrange(2000), 3) 936 for i in xrange(100): 937 self.assertEqual(a.next(), i) 938 self.assertEqual(list(b), range(2000)) 939 self.assertEqual([c.next(), c.next()], range(2)) 940 self.assertEqual(list(a), range(100,2000)) 941 self.assertEqual(list(c), range(2,2000)) 942 943 # test values of n 944 self.assertRaises(TypeError, tee, 'abc', 'invalid') 945 self.assertRaises(ValueError, tee, [], -1) 946 for n in xrange(5): 947 result = tee('abc', n) 948 self.assertEqual(type(result), tuple) 949 self.assertEqual(len(result), n) 950 self.assertEqual(map(list, result), [list('abc')]*n) 951 952 # tee pass-through to copyable iterator 953 a, b = tee('abc') 954 c, d = tee(a) 955 self.assertTrue(a is c) 956 957 # test tee_new 958 t1, t2 = tee('abc') 959 tnew = type(t1) 960 self.assertRaises(TypeError, tnew) 961 self.assertRaises(TypeError, tnew, 10) 962 t3 = tnew(t1) 963 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc')) 964 965 # test that tee objects are weak referencable 966 a, b = tee(xrange(10)) 967 p = weakref.proxy(a) 968 self.assertEqual(getattr(p, '__class__'), type(b)) 969 del a 970 self.assertRaises(ReferenceError, getattr, p, '__class__') 971 972 # Issue 13454: Crash when deleting backward iterator from tee() 973 def test_tee_del_backward(self): 974 forward, backward = tee(repeat(None, 20000000)) 975 try: 976 any(forward) # exhaust the iterator 977 del backward 978 except: 979 del forward, backward 980 raise 981 982 def test_StopIteration(self): 983 self.assertRaises(StopIteration, izip().next) 984 985 for f in (chain, cycle, izip, groupby): 986 self.assertRaises(StopIteration, f([]).next) 987 self.assertRaises(StopIteration, f(StopNow()).next) 988 989 self.assertRaises(StopIteration, islice([], None).next) 990 self.assertRaises(StopIteration, islice(StopNow(), None).next) 991 992 p, q = tee([]) 993 self.assertRaises(StopIteration, p.next) 994 self.assertRaises(StopIteration, q.next) 995 p, q = tee(StopNow()) 996 self.assertRaises(StopIteration, p.next) 997 self.assertRaises(StopIteration, q.next) 998 999 self.assertRaises(StopIteration, repeat(None, 0).next) 1000 1001 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap): 1002 self.assertRaises(StopIteration, f(lambda x:x, []).next) 1003 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next) 1004 1005class TestExamples(unittest.TestCase): 1006 1007 def test_chain(self): 1008 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF') 1009 1010 def test_chain_from_iterable(self): 1011 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF') 1012 1013 def test_combinations(self): 1014 self.assertEqual(list(combinations('ABCD', 2)), 1015 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')]) 1016 self.assertEqual(list(combinations(range(4), 3)), 1017 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)]) 1018 1019 def test_combinations_with_replacement(self): 1020 self.assertEqual(list(combinations_with_replacement('ABC', 2)), 1021 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')]) 1022 1023 def test_compress(self): 1024 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF')) 1025 1026 def test_count(self): 1027 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14]) 1028 1029 def test_cycle(self): 1030 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD')) 1031 1032 def test_dropwhile(self): 1033 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1]) 1034 1035 def test_groupby(self): 1036 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')], 1037 list('ABCDAB')) 1038 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')], 1039 [list('AAAA'), list('BBB'), list('CC'), list('D')]) 1040 1041 def test_ifilter(self): 1042 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9]) 1043 1044 def test_ifilterfalse(self): 1045 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8]) 1046 1047 def test_imap(self): 1048 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000]) 1049 1050 def test_islice(self): 1051 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB')) 1052 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD')) 1053 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG')) 1054 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG')) 1055 1056 def test_izip(self): 1057 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')]) 1058 1059 def test_izip_longest(self): 1060 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')), 1061 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]) 1062 1063 def test_permutations(self): 1064 self.assertEqual(list(permutations('ABCD', 2)), 1065 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())) 1066 self.assertEqual(list(permutations(range(3))), 1067 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)]) 1068 1069 def test_product(self): 1070 self.assertEqual(list(product('ABCD', 'xy')), 1071 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())) 1072 self.assertEqual(list(product(range(2), repeat=3)), 1073 [(0,0,0), (0,0,1), (0,1,0), (0,1,1), 1074 (1,0,0), (1,0,1), (1,1,0), (1,1,1)]) 1075 1076 def test_repeat(self): 1077 self.assertEqual(list(repeat(10, 3)), [10, 10, 10]) 1078 1079 def test_stapmap(self): 1080 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])), 1081 [32, 9, 1000]) 1082 1083 def test_takewhile(self): 1084 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4]) 1085 1086 1087class TestGC(unittest.TestCase): 1088 1089 def makecycle(self, iterator, container): 1090 container.append(iterator) 1091 iterator.next() 1092 del container, iterator 1093 1094 def test_chain(self): 1095 a = [] 1096 self.makecycle(chain(a), a) 1097 1098 def test_chain_from_iterable(self): 1099 a = [] 1100 self.makecycle(chain.from_iterable([a]), a) 1101 1102 def test_combinations(self): 1103 a = [] 1104 self.makecycle(combinations([1,2,a,3], 3), a) 1105 1106 def test_combinations_with_replacement(self): 1107 a = [] 1108 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a) 1109 1110 def test_compress(self): 1111 a = [] 1112 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a) 1113 1114 def test_count(self): 1115 a = [] 1116 Int = type('Int', (int,), dict(x=a)) 1117 self.makecycle(count(Int(0), Int(1)), a) 1118 1119 def test_cycle(self): 1120 a = [] 1121 self.makecycle(cycle([a]*2), a) 1122 1123 def test_dropwhile(self): 1124 a = [] 1125 self.makecycle(dropwhile(bool, [0, a, a]), a) 1126 1127 def test_groupby(self): 1128 a = [] 1129 self.makecycle(groupby([a]*2, lambda x:x), a) 1130 1131 def test_issue2246(self): 1132 # Issue 2246 -- the _grouper iterator was not included in GC 1133 n = 10 1134 keyfunc = lambda x: x 1135 for i, j in groupby(xrange(n), key=keyfunc): 1136 keyfunc.__dict__.setdefault('x',[]).append(j) 1137 1138 def test_ifilter(self): 1139 a = [] 1140 self.makecycle(ifilter(lambda x:True, [a]*2), a) 1141 1142 def test_ifilterfalse(self): 1143 a = [] 1144 self.makecycle(ifilterfalse(lambda x:False, a), a) 1145 1146 def test_izip(self): 1147 a = [] 1148 self.makecycle(izip([a]*2, [a]*3), a) 1149 1150 def test_izip_longest(self): 1151 a = [] 1152 self.makecycle(izip_longest([a]*2, [a]*3), a) 1153 b = [a, None] 1154 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a) 1155 1156 def test_imap(self): 1157 a = [] 1158 self.makecycle(imap(lambda x:x, [a]*2), a) 1159 1160 def test_islice(self): 1161 a = [] 1162 self.makecycle(islice([a]*2, None), a) 1163 1164 def test_permutations(self): 1165 a = [] 1166 self.makecycle(permutations([1,2,a,3], 3), a) 1167 1168 def test_product(self): 1169 a = [] 1170 self.makecycle(product([1,2,a,3], repeat=3), a) 1171 1172 def test_repeat(self): 1173 a = [] 1174 self.makecycle(repeat(a), a) 1175 1176 def test_starmap(self): 1177 a = [] 1178 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a) 1179 1180 def test_takewhile(self): 1181 a = [] 1182 self.makecycle(takewhile(bool, [1, 0, a, a]), a) 1183 1184def R(seqn): 1185 'Regular generator' 1186 for i in seqn: 1187 yield i 1188 1189class G: 1190 'Sequence using __getitem__' 1191 def __init__(self, seqn): 1192 self.seqn = seqn 1193 def __getitem__(self, i): 1194 return self.seqn[i] 1195 1196class I: 1197 'Sequence using iterator protocol' 1198 def __init__(self, seqn): 1199 self.seqn = seqn 1200 self.i = 0 1201 def __iter__(self): 1202 return self 1203 def next(self): 1204 if self.i >= len(self.seqn): raise StopIteration 1205 v = self.seqn[self.i] 1206 self.i += 1 1207 return v 1208 1209class Ig: 1210 'Sequence using iterator protocol defined with a generator' 1211 def __init__(self, seqn): 1212 self.seqn = seqn 1213 self.i = 0 1214 def __iter__(self): 1215 for val in self.seqn: 1216 yield val 1217 1218class X: 1219 'Missing __getitem__ and __iter__' 1220 def __init__(self, seqn): 1221 self.seqn = seqn 1222 self.i = 0 1223 def next(self): 1224 if self.i >= len(self.seqn): raise StopIteration 1225 v = self.seqn[self.i] 1226 self.i += 1 1227 return v 1228 1229class N: 1230 'Iterator missing next()' 1231 def __init__(self, seqn): 1232 self.seqn = seqn 1233 self.i = 0 1234 def __iter__(self): 1235 return self 1236 1237class E: 1238 'Test propagation of exceptions' 1239 def __init__(self, seqn): 1240 self.seqn = seqn 1241 self.i = 0 1242 def __iter__(self): 1243 return self 1244 def next(self): 1245 3 // 0 1246 1247class S: 1248 'Test immediate stop' 1249 def __init__(self, seqn): 1250 pass 1251 def __iter__(self): 1252 return self 1253 def next(self): 1254 raise StopIteration 1255 1256def L(seqn): 1257 'Test multiple tiers of iterators' 1258 return chain(imap(lambda x:x, R(Ig(G(seqn))))) 1259 1260 1261class TestVariousIteratorArgs(unittest.TestCase): 1262 1263 def test_chain(self): 1264 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1265 for g in (G, I, Ig, S, L, R): 1266 self.assertEqual(list(chain(g(s))), list(g(s))) 1267 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s))) 1268 self.assertRaises(TypeError, list, chain(X(s))) 1269 self.assertRaises(TypeError, list, chain(N(s))) 1270 self.assertRaises(ZeroDivisionError, list, chain(E(s))) 1271 1272 def test_compress(self): 1273 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1274 n = len(s) 1275 for g in (G, I, Ig, S, L, R): 1276 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s))) 1277 self.assertRaises(TypeError, compress, X(s), repeat(1)) 1278 self.assertRaises(TypeError, list, compress(N(s), repeat(1))) 1279 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1))) 1280 1281 def test_product(self): 1282 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1283 self.assertRaises(TypeError, product, X(s)) 1284 self.assertRaises(TypeError, product, N(s)) 1285 self.assertRaises(ZeroDivisionError, product, E(s)) 1286 1287 def test_cycle(self): 1288 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1289 for g in (G, I, Ig, S, L, R): 1290 tgtlen = len(s) * 3 1291 expected = list(g(s))*3 1292 actual = list(islice(cycle(g(s)), tgtlen)) 1293 self.assertEqual(actual, expected) 1294 self.assertRaises(TypeError, cycle, X(s)) 1295 self.assertRaises(TypeError, list, cycle(N(s))) 1296 self.assertRaises(ZeroDivisionError, list, cycle(E(s))) 1297 1298 def test_groupby(self): 1299 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)): 1300 for g in (G, I, Ig, S, L, R): 1301 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s))) 1302 self.assertRaises(TypeError, groupby, X(s)) 1303 self.assertRaises(TypeError, list, groupby(N(s))) 1304 self.assertRaises(ZeroDivisionError, list, groupby(E(s))) 1305 1306 def test_ifilter(self): 1307 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)): 1308 for g in (G, I, Ig, S, L, R): 1309 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s))) 1310 self.assertRaises(TypeError, ifilter, isEven, X(s)) 1311 self.assertRaises(TypeError, list, ifilter(isEven, N(s))) 1312 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s))) 1313 1314 def test_ifilterfalse(self): 1315 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)): 1316 for g in (G, I, Ig, S, L, R): 1317 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s))) 1318 self.assertRaises(TypeError, ifilterfalse, isEven, X(s)) 1319 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s))) 1320 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s))) 1321 1322 def test_izip(self): 1323 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1324 for g in (G, I, Ig, S, L, R): 1325 self.assertEqual(list(izip(g(s))), zip(g(s))) 1326 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s))) 1327 self.assertRaises(TypeError, izip, X(s)) 1328 self.assertRaises(TypeError, list, izip(N(s))) 1329 self.assertRaises(ZeroDivisionError, list, izip(E(s))) 1330 1331 def test_iziplongest(self): 1332 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1333 for g in (G, I, Ig, S, L, R): 1334 self.assertEqual(list(izip_longest(g(s))), zip(g(s))) 1335 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s))) 1336 self.assertRaises(TypeError, izip_longest, X(s)) 1337 self.assertRaises(TypeError, list, izip_longest(N(s))) 1338 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s))) 1339 1340 def test_imap(self): 1341 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)): 1342 for g in (G, I, Ig, S, L, R): 1343 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s))) 1344 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s))) 1345 self.assertRaises(TypeError, imap, onearg, X(s)) 1346 self.assertRaises(TypeError, list, imap(onearg, N(s))) 1347 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s))) 1348 1349 def test_islice(self): 1350 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1351 for g in (G, I, Ig, S, L, R): 1352 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2]) 1353 self.assertRaises(TypeError, islice, X(s), 10) 1354 self.assertRaises(TypeError, list, islice(N(s), 10)) 1355 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10)) 1356 1357 def test_starmap(self): 1358 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)): 1359 for g in (G, I, Ig, S, L, R): 1360 ss = zip(s, s) 1361 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s))) 1362 self.assertRaises(TypeError, starmap, operator.pow, X(ss)) 1363 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss))) 1364 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss))) 1365 1366 def test_takewhile(self): 1367 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)): 1368 for g in (G, I, Ig, S, L, R): 1369 tgt = [] 1370 for elem in g(s): 1371 if not isEven(elem): break 1372 tgt.append(elem) 1373 self.assertEqual(list(takewhile(isEven, g(s))), tgt) 1374 self.assertRaises(TypeError, takewhile, isEven, X(s)) 1375 self.assertRaises(TypeError, list, takewhile(isEven, N(s))) 1376 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s))) 1377 1378 def test_dropwhile(self): 1379 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)): 1380 for g in (G, I, Ig, S, L, R): 1381 tgt = [] 1382 for elem in g(s): 1383 if not tgt and isOdd(elem): continue 1384 tgt.append(elem) 1385 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt) 1386 self.assertRaises(TypeError, dropwhile, isOdd, X(s)) 1387 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s))) 1388 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s))) 1389 1390 def test_tee(self): 1391 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): 1392 for g in (G, I, Ig, S, L, R): 1393 it1, it2 = tee(g(s)) 1394 self.assertEqual(list(it1), list(g(s))) 1395 self.assertEqual(list(it2), list(g(s))) 1396 self.assertRaises(TypeError, tee, X(s)) 1397 self.assertRaises(TypeError, list, tee(N(s))[0]) 1398 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0]) 1399 1400class LengthTransparency(unittest.TestCase): 1401 1402 def test_repeat(self): 1403 from test.test_iterlen import len 1404 self.assertEqual(len(repeat(None, 50)), 50) 1405 self.assertRaises(TypeError, len, repeat(None)) 1406 1407class RegressionTests(unittest.TestCase): 1408 1409 def test_sf_793826(self): 1410 # Fix Armin Rigo's successful efforts to wreak havoc 1411 1412 def mutatingtuple(tuple1, f, tuple2): 1413 # this builds a tuple t which is a copy of tuple1, 1414 # then calls f(t), then mutates t to be equal to tuple2 1415 # (needs len(tuple1) == len(tuple2)). 1416 def g(value, first=[1]): 1417 if first: 1418 del first[:] 1419 f(z.next()) 1420 return value 1421 items = list(tuple2) 1422 items[1:1] = list(tuple1) 1423 gen = imap(g, items) 1424 z = izip(*[gen]*len(tuple1)) 1425 z.next() 1426 1427 def f(t): 1428 global T 1429 T = t 1430 first[:] = list(T) 1431 1432 first = [] 1433 mutatingtuple((1,2,3), f, (4,5,6)) 1434 second = list(T) 1435 self.assertEqual(first, second) 1436 1437 1438 def test_sf_950057(self): 1439 # Make sure that chain() and cycle() catch exceptions immediately 1440 # rather than when shifting between input sources 1441 1442 def gen1(): 1443 hist.append(0) 1444 yield 1 1445 hist.append(1) 1446 raise AssertionError 1447 hist.append(2) 1448 1449 def gen2(x): 1450 hist.append(3) 1451 yield 2 1452 hist.append(4) 1453 if x: 1454 raise StopIteration 1455 1456 hist = [] 1457 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False))) 1458 self.assertEqual(hist, [0,1]) 1459 1460 hist = [] 1461 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True))) 1462 self.assertEqual(hist, [0,1]) 1463 1464 hist = [] 1465 self.assertRaises(AssertionError, list, cycle(gen1())) 1466 self.assertEqual(hist, [0,1]) 1467 1468class SubclassWithKwargsTest(unittest.TestCase): 1469 def test_keywords_in_subclass(self): 1470 # count is not subclassable... 1471 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap, 1472 starmap, islice, takewhile, dropwhile, cycle, compress): 1473 class Subclass(cls): 1474 def __init__(self, newarg=None, *args): 1475 cls.__init__(self, *args) 1476 try: 1477 Subclass(newarg=1) 1478 except TypeError, err: 1479 # we expect type errors because of wrong argument count 1480 self.assertNotIn("does not take keyword arguments", err.args[0]) 1481 1482 1483libreftest = """ Doctest for examples in the library reference: libitertools.tex 1484 1485 1486>>> amounts = [120.15, 764.05, 823.14] 1487>>> for checknum, amount in izip(count(1200), amounts): 1488... print 'Check %d is for $%.2f' % (checknum, amount) 1489... 1490Check 1200 is for $120.15 1491Check 1201 is for $764.05 1492Check 1202 is for $823.14 1493 1494>>> import operator 1495>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)): 1496... print cube 1497... 14981 14998 150027 1501 1502>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele'] 1503>>> for name in islice(reportlines, 3, None, 2): 1504... print name.title() 1505... 1506Alex 1507Laura 1508Martin 1509Walter 1510Samuele 1511 1512>>> from operator import itemgetter 1513>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3) 1514>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1)) 1515>>> for k, g in groupby(di, itemgetter(1)): 1516... print k, map(itemgetter(0), g) 1517... 15181 ['a', 'c', 'e'] 15192 ['b', 'd', 'f'] 15203 ['g'] 1521 1522# Find runs of consecutive numbers using groupby. The key to the solution 1523# is differencing with a range so that consecutive numbers all appear in 1524# same group. 1525>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28] 1526>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]): 1527... print map(operator.itemgetter(1), g) 1528... 1529[1] 1530[4, 5, 6] 1531[10] 1532[15, 16, 17, 18] 1533[22] 1534[25, 26, 27, 28] 1535 1536>>> def take(n, iterable): 1537... "Return first n items of the iterable as a list" 1538... return list(islice(iterable, n)) 1539 1540>>> def enumerate(iterable, start=0): 1541... return izip(count(start), iterable) 1542 1543>>> def tabulate(function, start=0): 1544... "Return function(0), function(1), ..." 1545... return imap(function, count(start)) 1546 1547>>> def nth(iterable, n, default=None): 1548... "Returns the nth item or a default value" 1549... return next(islice(iterable, n, None), default) 1550 1551>>> def all_equal(iterable): 1552... "Returns True if all the elements are equal to each other" 1553... g = groupby(iterable) 1554... return next(g, True) and not next(g, False) 1555 1556>>> def quantify(iterable, pred=bool): 1557... "Count how many times the predicate is true" 1558... return sum(imap(pred, iterable)) 1559 1560>>> def padnone(iterable): 1561... "Returns the sequence elements and then returns None indefinitely" 1562... return chain(iterable, repeat(None)) 1563 1564>>> def ncycles(iterable, n): 1565... "Returns the sequence elements n times" 1566... return chain(*repeat(iterable, n)) 1567 1568>>> def dotproduct(vec1, vec2): 1569... return sum(imap(operator.mul, vec1, vec2)) 1570 1571>>> def flatten(listOfLists): 1572... return list(chain.from_iterable(listOfLists)) 1573 1574>>> def repeatfunc(func, times=None, *args): 1575... "Repeat calls to func with specified arguments." 1576... " Example: repeatfunc(random.random)" 1577... if times is None: 1578... return starmap(func, repeat(args)) 1579... else: 1580... return starmap(func, repeat(args, times)) 1581 1582>>> def pairwise(iterable): 1583... "s -> (s0,s1), (s1,s2), (s2, s3), ..." 1584... a, b = tee(iterable) 1585... for elem in b: 1586... break 1587... return izip(a, b) 1588 1589>>> def grouper(n, iterable, fillvalue=None): 1590... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 1591... args = [iter(iterable)] * n 1592... return izip_longest(fillvalue=fillvalue, *args) 1593 1594>>> def roundrobin(*iterables): 1595... "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 1596... # Recipe credited to George Sakkis 1597... pending = len(iterables) 1598... nexts = cycle(iter(it).next for it in iterables) 1599... while pending: 1600... try: 1601... for next in nexts: 1602... yield next() 1603... except StopIteration: 1604... pending -= 1 1605... nexts = cycle(islice(nexts, pending)) 1606 1607>>> def powerset(iterable): 1608... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" 1609... s = list(iterable) 1610... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) 1611 1612>>> def unique_everseen(iterable, key=None): 1613... "List unique elements, preserving order. Remember all elements ever seen." 1614... # unique_everseen('AAAABBBCCDAABBB') --> A B C D 1615... # unique_everseen('ABBCcAD', str.lower) --> A B C D 1616... seen = set() 1617... seen_add = seen.add 1618... if key is None: 1619... for element in iterable: 1620... if element not in seen: 1621... seen_add(element) 1622... yield element 1623... else: 1624... for element in iterable: 1625... k = key(element) 1626... if k not in seen: 1627... seen_add(k) 1628... yield element 1629 1630>>> def unique_justseen(iterable, key=None): 1631... "List unique elements, preserving order. Remember only the element just seen." 1632... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B 1633... # unique_justseen('ABBCcAD', str.lower) --> A B C A D 1634... return imap(next, imap(itemgetter(1), groupby(iterable, key))) 1635 1636This is not part of the examples but it tests to make sure the definitions 1637perform as purported. 1638 1639>>> take(10, count()) 1640[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1641 1642>>> list(enumerate('abc')) 1643[(0, 'a'), (1, 'b'), (2, 'c')] 1644 1645>>> list(islice(tabulate(lambda x: 2*x), 4)) 1646[0, 2, 4, 6] 1647 1648>>> nth('abcde', 3) 1649'd' 1650 1651>>> nth('abcde', 9) is None 1652True 1653 1654>>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')] 1655[True, True, True, False, False] 1656 1657>>> quantify(xrange(99), lambda x: x%2==0) 165850 1659 1660>>> a = [[1, 2, 3], [4, 5, 6]] 1661>>> flatten(a) 1662[1, 2, 3, 4, 5, 6] 1663 1664>>> list(repeatfunc(pow, 5, 2, 3)) 1665[8, 8, 8, 8, 8] 1666 1667>>> import random 1668>>> take(5, imap(int, repeatfunc(random.random))) 1669[0, 0, 0, 0, 0] 1670 1671>>> list(pairwise('abcd')) 1672[('a', 'b'), ('b', 'c'), ('c', 'd')] 1673 1674>>> list(pairwise([])) 1675[] 1676 1677>>> list(pairwise('a')) 1678[] 1679 1680>>> list(islice(padnone('abc'), 0, 6)) 1681['a', 'b', 'c', None, None, None] 1682 1683>>> list(ncycles('abc', 3)) 1684['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'] 1685 1686>>> dotproduct([1,2,3], [4,5,6]) 168732 1688 1689>>> list(grouper(3, 'abcdefg', 'x')) 1690[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')] 1691 1692>>> list(roundrobin('abc', 'd', 'ef')) 1693['a', 'd', 'e', 'b', 'f', 'c'] 1694 1695>>> list(powerset([1,2,3])) 1696[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] 1697 1698>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18)) 1699True 1700 1701>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len) 1702True 1703 1704>>> list(unique_everseen('AAAABBBCCDAABBB')) 1705['A', 'B', 'C', 'D'] 1706 1707>>> list(unique_everseen('ABBCcAD', str.lower)) 1708['A', 'B', 'C', 'D'] 1709 1710>>> list(unique_justseen('AAAABBBCCDAABBB')) 1711['A', 'B', 'C', 'D', 'A', 'B'] 1712 1713>>> list(unique_justseen('ABBCcAD', str.lower)) 1714['A', 'B', 'C', 'A', 'D'] 1715 1716""" 1717 1718__test__ = {'libreftest' : libreftest} 1719 1720def test_main(verbose=None): 1721 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC, 1722 RegressionTests, LengthTransparency, 1723 SubclassWithKwargsTest, TestExamples) 1724 test_support.run_unittest(*test_classes) 1725 1726 # verify reference counting 1727 if verbose and hasattr(sys, "gettotalrefcount"): 1728 import gc 1729 counts = [None] * 5 1730 for i in xrange(len(counts)): 1731 test_support.run_unittest(*test_classes) 1732 gc.collect() 1733 counts[i] = sys.gettotalrefcount() 1734 print counts 1735 1736 # doctest the examples in the library reference 1737 test_support.run_doctest(sys.modules[__name__], verbose) 1738 1739if __name__ == "__main__": 1740 test_main(verbose=True) 1741