PythonExtra/tests/basics/generator_close.py
Damien George 3f6ffe059f py/objgenerator: Implement PEP479, StopIteration convs to RuntimeError.
This commit implements PEP479 which disallows raising StopIteration inside
a generator to signal that it should be finished.  Instead, the generator
should simply return when it is complete.

See https://www.python.org/dev/peps/pep-0479/ for details.
2018-09-20 15:36:59 +10:00

61 lines
1 KiB
Python

def gen1():
yield 1
yield 2
# Test that it's possible to close just created gen
g = gen1()
print(g.close())
try:
next(g)
except StopIteration:
print("StopIteration")
# Test that it's possible to close gen in progress
g = gen1()
print(next(g))
print(g.close())
try:
next(g)
print("No StopIteration")
except StopIteration:
print("StopIteration")
# Test that it's possible to close finished gen
g = gen1()
print(list(g))
print(g.close())
try:
next(g)
print("No StopIteration")
except StopIteration:
print("StopIteration")
# Throwing GeneratorExit in response to close() is ok
def gen2():
try:
yield 1
yield 2
except:
print('raising GeneratorExit')
raise GeneratorExit
g = gen2()
next(g)
print(g.close())
# Any other exception is propagated to the .close() caller
def gen3():
try:
yield 1
yield 2
except:
raise ValueError
g = gen3()
next(g)
try:
print(g.close())
except ValueError:
print("ValueError")