# mode: run
# tag: generators, pep479
from __future__ import generator_stop
import sys
if sys.version_info[0] >= 3:
# additionally test exception chaining
__doc__ = u"""
>>> g = test_raise_StopIteration_value()
>>> next(g)
1
>>> try: next(g)
... except RuntimeError as exc:
... print(type(exc.__context__) is StopIteration or type(exc.__context__), exc.__context__)
... else:
... print("NOT RAISED!")
True huhu
"""
def test_raise_StopIteration():
"""
>>> g = test_raise_StopIteration()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
"""
yield 1
raise StopIteration
def test_raise_StopIteration_value():
"""
>>> g = test_raise_StopIteration_value()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
"""
yield 1
raise StopIteration('huhu')
def test_return():
"""
>>> g = test_return()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
StopIteration
"""
yield 1
return
def test_return_value():
"""
>>> g = test_return_value()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
StopIteration: 2
"""
yield 1
return 2
def test_propagate_StopIteration(it):
"""
>>> results = []
>>> for x in test_propagate_StopIteration(iter([])):
... results.append(x)
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
>>> results
[]
>>> for x in test_propagate_StopIteration(iter([1, 2])):
... results.append(x)
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
>>> results
[1, 2]
"""
while True:
yield next(it)
def test_catch_StopIteration(it):
"""
>>> for x in test_catch_StopIteration(iter([])):
... print(x)
>>> for x in test_catch_StopIteration(iter([1, 2])):
... print(x)
1
2
"""
try:
while True:
yield next(it)
except StopIteration:
pass
else:
print("NOT RAISED!")
def test_yield_from(it):
"""
>>> for x in test_yield_from(iter([])):
... print(x)
>>> for x in test_yield_from(iter([1, 2])):
... print(x)
1
2
"""
yield from it
def test_yield_from_gen():
"""
>>> for x in test_yield_from_gen():
... print(x)
1
RETURN: 2
"""
x = yield from test_return_value()
print("RETURN: %s" % x)
def test_genexpr(it):
"""
>>> list(test_genexpr(iter([])))
[]
>>> list(test_genexpr(iter([1, 2])))
[1]
>>> list(test_genexpr(iter([1])))
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
>>> list(test_genexpr(iter([1, 2, 3])))
Traceback (most recent call last):
RuntimeError: generator raised StopIteration
>>> list(test_genexpr(iter([1, 2])))
[1]
"""
return (x for x in it if next(it))