summaryrefslogtreecommitdiff
path: root/tests/basics
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-09-14 00:44:06 +1000
committerDamien George <damien.p.george@gmail.com>2018-09-20 15:36:59 +1000
commit3f6ffe059f64b3ebc44dc0bbc63452cb8850702b (patch)
tree5bf2fe77ad624afccd08011ab05b19ab321b5d9c /tests/basics
parent17f7c683d2790880ec9da70f7bc7e40c490c8796 (diff)
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.
Diffstat (limited to 'tests/basics')
-rw-r--r--tests/basics/gen_yield_from.py28
-rw-r--r--tests/basics/gen_yield_from.py.exp14
-rw-r--r--tests/basics/gen_yield_from_close.py6
-rw-r--r--tests/basics/gen_yield_from_close.py.exp20
-rw-r--r--tests/basics/gen_yield_from_throw.py18
-rw-r--r--tests/basics/gen_yield_from_throw.py.exp6
-rw-r--r--tests/basics/generator_close.py5
-rw-r--r--tests/basics/generator_close.py.exp10
-rw-r--r--tests/basics/generator_pep479.py29
-rw-r--r--tests/basics/generator_pep479.py.exp5
10 files changed, 56 insertions, 85 deletions
diff --git a/tests/basics/gen_yield_from.py b/tests/basics/gen_yield_from.py
index 4e68aec63..037644e1e 100644
--- a/tests/basics/gen_yield_from.py
+++ b/tests/basics/gen_yield_from.py
@@ -13,34 +13,6 @@ g = gen2()
print(list(g))
-# Like above, but terminate subgen using StopIteration
-def gen3():
- yield 1
- yield 2
- raise StopIteration
-
-def gen4():
- print("here1")
- print((yield from gen3()))
- print("here2")
-
-g = gen4()
-print(list(g))
-
-# Like above, but terminate subgen using StopIteration with value
-def gen5():
- yield 1
- yield 2
- raise StopIteration(123)
-
-def gen6():
- print("here1")
- print((yield from gen5()))
- print("here2")
-
-g = gen6()
-print(list(g))
-
# StopIteration from within a Python function, within a native iterator (map), within a yield from
def gen7(x):
if x < 3:
diff --git a/tests/basics/gen_yield_from.py.exp b/tests/basics/gen_yield_from.py.exp
deleted file mode 100644
index 507f2b9ca..000000000
--- a/tests/basics/gen_yield_from.py.exp
+++ /dev/null
@@ -1,14 +0,0 @@
-here1
-3
-here2
-[1, 2]
-here1
-None
-here2
-[1, 2]
-here1
-123
-here2
-[1, 2]
-444
-[0, 1, 2]
diff --git a/tests/basics/gen_yield_from_close.py b/tests/basics/gen_yield_from_close.py
index 833986105..e3e0116ff 100644
--- a/tests/basics/gen_yield_from_close.py
+++ b/tests/basics/gen_yield_from_close.py
@@ -55,14 +55,14 @@ except StopIteration:
# Yet another variation - leaf generator gets GeneratorExit,
-# but raises StopIteration instead. This still should close chain properly.
+# and reraises a new GeneratorExit. This still should close chain properly.
def gen5():
yield 1
try:
yield 2
except GeneratorExit:
- print("leaf caught GeneratorExit and raised StopIteration instead")
- raise StopIteration(123)
+ print("leaf caught GeneratorExit and reraised GeneratorExit")
+ raise GeneratorExit(123)
yield 3
yield 4
diff --git a/tests/basics/gen_yield_from_close.py.exp b/tests/basics/gen_yield_from_close.py.exp
deleted file mode 100644
index a44d1353d..000000000
--- a/tests/basics/gen_yield_from_close.py.exp
+++ /dev/null
@@ -1,20 +0,0 @@
--1
-1
-StopIteration
--1
-1
-2
-leaf caught GeneratorExit and swallowed it
-delegating caught GeneratorExit
-StopIteration
--1
-1
-2
-leaf caught GeneratorExit and raised StopIteration instead
-delegating caught GeneratorExit
-StopIteration
-123
-RuntimeError
-0
-1
-close
diff --git a/tests/basics/gen_yield_from_throw.py b/tests/basics/gen_yield_from_throw.py
index 829bf0f3b..4d65b3c17 100644
--- a/tests/basics/gen_yield_from_throw.py
+++ b/tests/basics/gen_yield_from_throw.py
@@ -25,6 +25,20 @@ def gen3():
g3 = gen3()
print(next(g3))
try:
- g3.throw(StopIteration)
+ g3.throw(KeyError)
+except KeyError:
+ print('got KeyError from downstream!')
+
+# case where a thrown exception is caught and stops the generator
+def gen4():
+ try:
+ yield 1
+ yield 2
+ except:
+ pass
+g4 = gen4()
+print(next(g4))
+try:
+ g4.throw(ValueError)
except StopIteration:
- print('got StopIteration from downstream!')
+ print('got StopIteration')
diff --git a/tests/basics/gen_yield_from_throw.py.exp b/tests/basics/gen_yield_from_throw.py.exp
deleted file mode 100644
index 6ce97ad86..000000000
--- a/tests/basics/gen_yield_from_throw.py.exp
+++ /dev/null
@@ -1,6 +0,0 @@
-1
-got ValueError from upstream!
-str1
-got TypeError from downstream!
-123
-got StopIteration from downstream!
diff --git a/tests/basics/generator_close.py b/tests/basics/generator_close.py
index aa563f2a8..1ccc78dbe 100644
--- a/tests/basics/generator_close.py
+++ b/tests/basics/generator_close.py
@@ -31,13 +31,14 @@ except StopIteration:
print("StopIteration")
-# Throwing StopIteration in response to close() is ok
+# Throwing GeneratorExit in response to close() is ok
def gen2():
try:
yield 1
yield 2
except:
- raise StopIteration
+ print('raising GeneratorExit')
+ raise GeneratorExit
g = gen2()
next(g)
diff --git a/tests/basics/generator_close.py.exp b/tests/basics/generator_close.py.exp
deleted file mode 100644
index fcd583935..000000000
--- a/tests/basics/generator_close.py.exp
+++ /dev/null
@@ -1,10 +0,0 @@
-None
-StopIteration
-1
-None
-StopIteration
-[1, 2]
-None
-StopIteration
-None
-ValueError
diff --git a/tests/basics/generator_pep479.py b/tests/basics/generator_pep479.py
new file mode 100644
index 000000000..e422c349e
--- /dev/null
+++ b/tests/basics/generator_pep479.py
@@ -0,0 +1,29 @@
+# tests for correct PEP479 behaviour (introduced in Python 3.5)
+
+# basic case: StopIteration is converted into a RuntimeError
+def gen():
+ yield 1
+ raise StopIteration
+g = gen()
+print(next(g))
+try:
+ next(g)
+except RuntimeError:
+ print('RuntimeError')
+
+# trying to continue a failed generator now raises StopIteration
+try:
+ next(g)
+except StopIteration:
+ print('StopIteration')
+
+# throwing a StopIteration which is uncaught will be converted into a RuntimeError
+def gen():
+ yield 1
+ yield 2
+g = gen()
+print(next(g))
+try:
+ g.throw(StopIteration)
+except RuntimeError:
+ print('RuntimeError')
diff --git a/tests/basics/generator_pep479.py.exp b/tests/basics/generator_pep479.py.exp
new file mode 100644
index 000000000..c64fe4956
--- /dev/null
+++ b/tests/basics/generator_pep479.py.exp
@@ -0,0 +1,5 @@
+1
+RuntimeError
+StopIteration
+1
+RuntimeError