test_genexps.py revision 0a8c90248264a8b26970b4473770bcc3df8515f
10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodoctests = """ 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 30a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest simple loop with conditional 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> sum(i*i for i in range(100) if i&1 == 1) 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 166650 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest simple nesting 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list((i,j) for i in range(3) for j in range(4) ) 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 130a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest nesting with the inner expression dependent on the outer 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list((i,j) for i in range(4) for j in range(i) ) 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 180a8c90248264a8b26970b4473770bcc3df8515fJosh GaoMake sure the induction variable is not exposed 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> i = 20 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> sum(i*i for i in range(100)) 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 328350 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> i 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 20 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 260a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest first class 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(4)) 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> type(g) 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao <type 'generator'> 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(g) 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 4, 9] 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 340a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest direct calls to next() 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(3)) 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 0 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#21>", line 1, in -toplevel- 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g.next() 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StopIteration 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 490a8c90248264a8b26970b4473770bcc3df8515fJosh GaoDoes it stay stopped? 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#21>", line 1, in -toplevel- 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g.next() 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StopIteration 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(g) 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [] 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 590a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest running gen when defining function is out of scope 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def f(n): 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... return (i*i for i in xrange(n)) 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(f(10)) 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def f(n): 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... return ((i,j) for i in xrange(3) for j in xrange(n)) 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(f(4)) 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def f(n): 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... return ((i,j) for i in xrange(3) for j in xrange(4) if j in xrange(n)) 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(f(4)) 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(f(2)) 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)] 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 770a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that parenthesis are required in a statement 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def f(n): 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... return i*i for i in xrange(n) 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao SyntaxError: invalid syntax 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 850a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that parenthesis are required when used as a keyword argument value 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> dict(a = i for i in xrange(10)) 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao SyntaxError: invalid syntax 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 920a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that parenthesis are required when used as a keyword argument value 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> dict(a = (i for i in xrange(10))) #doctest: +ELLIPSIS 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao {'a': <generator object <genexpr> at ...>} 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 970a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify early binding for the outermost for-expression 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> x=10 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(x)) 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> x = 5 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(g) 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1050a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that the outermost for-expression makes an immediate check 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofor iterability 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> (i for i in 6) 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#4>", line 1, in -toplevel- 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao (i for i in 6) 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TypeError: 'int' object is not iterable 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1140a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify late binding for the outermost if-expression 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> include = (2,4,6,8) 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(10) if i in include) 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> include = (1,3,5,7,9) 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(g) 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [1, 9, 25, 49, 81] 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1220a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify late binding for the innermost for-expression 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = ((i,j) for i in range(3) for j in range(x)) 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> x = 4 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(g) 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1290a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify re-use of tuples (a side benefit of using genexps over listcomps) 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> tupleids = map(id, ((i,i) for i in xrange(10))) 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> int(max(tupleids) - min(tupleids)) 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 0 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1350a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that syntax error's are raised for genexps used as lvalues 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> (y for y in (1,2)) = 10 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<doctest test.test_genexps.__test__.doctests[40]>", line 1 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao SyntaxError: can't assign to generator expression 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> (y for y in (1,2)) += 10 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<doctest test.test_genexps.__test__.doctests[41]>", line 1 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao SyntaxError: can't assign to generator expression 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao########### Tests borrowed from or inspired by test_generators.py ############ 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1520a8c90248264a8b26970b4473770bcc3df8515fJosh GaoMake a generator that acts like range() 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> yrange = lambda n: (i for i in xrange(n)) 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(yrange(10)) 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1580a8c90248264a8b26970b4473770bcc3df8515fJosh GaoGenerators always return to the most recent caller: 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def creator(): 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... r = yrange(5) 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... print "creator", r.next() 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... return r 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def caller(): 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... r = creator() 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... for i in r: 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... print "caller", i 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> caller() 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao creator 0 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao caller 1 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao caller 2 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao caller 3 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao caller 4 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1750a8c90248264a8b26970b4473770bcc3df8515fJosh GaoGenerators can call other generators: 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> def zrange(n): 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... for i in yrange(n): 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ... yield i 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(zrange(5)) 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 2, 3, 4] 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1840a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that a gen exp cannot be resumed while it is actively running: 1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (me.next() for i in xrange(10)) 1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me = g 1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me.next() 1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#30>", line 1, in -toplevel- 1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao me.next() 1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#28>", line 1, in <generator expression> 1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g = (me.next() for i in xrange(10)) 1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ValueError: generator already executing 1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1960a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify exception propagation 1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (10 // i for i in (5, 0, 2)) 1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2 2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#37>", line 1, in -toplevel- 2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g.next() 2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#35>", line 1, in <generator expression> 2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g = (10 // i for i in (5, 0, 2)) 2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ZeroDivisionError: integer division or modulo by zero 2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g.next() 2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Traceback (most recent call last): 2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao File "<pyshell#38>", line 1, in -toplevel- 2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g.next() 2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao StopIteration 2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2140a8c90248264a8b26970b4473770bcc3df8515fJosh GaoMake sure that None is a valid return value 2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(None for i in xrange(10)) 2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [None, None, None, None, None, None, None, None, None, None] 2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2190a8c90248264a8b26970b4473770bcc3df8515fJosh GaoCheck that generator attributes are present 2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(3)) 2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> expected = set(['gi_frame', 'gi_running', 'next']) 2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> set(attr for attr in dir(g) if not attr.startswith('__')) >= expected 2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao True 2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> from test.test_support import HAVE_DOCSTRINGS 2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> print(g.next.__doc__ if HAVE_DOCSTRINGS else 'x.next() -> the next value, or raise StopIteration') 2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.next() -> the next value, or raise StopIteration 2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> import types 2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> isinstance(g, types.GeneratorType) 2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao True 2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2330a8c90248264a8b26970b4473770bcc3df8515fJosh GaoCheck the __iter__ slot is defined to return self 2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> iter(g) is g 2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao True 2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2380a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that the running flag is set properly 2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (me.gi_running for i in (0,1)) 2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me = g 2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me.gi_running 2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 0 2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me.next() 2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1 2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> me.gi_running 2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 0 2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2490a8c90248264a8b26970b4473770bcc3df8515fJosh GaoVerify that genexps are weakly referencable 2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> import weakref 2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> g = (i*i for i in range(4)) 2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> wr = weakref.ref(g) 2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> wr() is g 2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao True 2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> p = weakref.proxy(g) 2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao >>> list(p) 2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao [0, 1, 4, 9] 2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" 2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao__test__ = {'doctests' : doctests} 2650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main(verbose=None): 2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao import sys 2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao from test import test_support 2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao from test import test_genexps 2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test_support.run_doctest(test_genexps, verbose) 2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # verify reference counting 2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose and hasattr(sys, "gettotalrefcount"): 2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao import gc 2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao counts = [None] * 5 2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in xrange(len(counts)): 2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test_support.run_doctest(test_genexps, verbose) 2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao gc.collect() 2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao counts[i] = sys.gettotalrefcount() 2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print counts 2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__": 2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test_main(verbose=True) 284