From 962b1cd1b120d777636ce8195d14f3d686e96619 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 23 Mar 2014 21:48:29 +0200 Subject: objgenerator: Implement return with value and .close() method. Return with value gets converted to StopIteration(value). Implementation keeps optimizing against creating of possibly unneeded exception objects, so there're considerable refactoring to implement these features. --- tests/basics/generator-return.py | 10 +++++++ tests/basics/generator_close.py | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 tests/basics/generator-return.py create mode 100644 tests/basics/generator_close.py (limited to 'tests') diff --git a/tests/basics/generator-return.py b/tests/basics/generator-return.py new file mode 100644 index 000000000..a3ac88575 --- /dev/null +++ b/tests/basics/generator-return.py @@ -0,0 +1,10 @@ +def gen(): + yield 1 + return 42 + +g = gen() +print(next(g)) +try: + print(next(g)) +except StopIteration as e: + print(repr(e)) diff --git a/tests/basics/generator_close.py b/tests/basics/generator_close.py new file mode 100644 index 000000000..aa563f2a8 --- /dev/null +++ b/tests/basics/generator_close.py @@ -0,0 +1,59 @@ +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 StopIteration in response to close() is ok +def gen2(): + try: + yield 1 + yield 2 + except: + raise StopIteration + +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") -- cgit v1.2.3