From f39d3b93da4b9205a095430e12472051c6b22ef6 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 30 Mar 2014 23:14:55 +0300 Subject: py: Implement support for generalized generator protocol. Iterators and ducktype objects can now be arguments of yield from. --- tests/basics/gen-yield-from-ducktype.py | 44 +++++++++++++++++++++++++++++++++ tests/basics/gen-yield-from-iter.py | 8 ++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/basics/gen-yield-from-ducktype.py create mode 100644 tests/basics/gen-yield-from-iter.py (limited to 'tests/basics') diff --git a/tests/basics/gen-yield-from-ducktype.py b/tests/basics/gen-yield-from-ducktype.py new file mode 100644 index 000000000..aa0109c91 --- /dev/null +++ b/tests/basics/gen-yield-from-ducktype.py @@ -0,0 +1,44 @@ +class MyGen: + + def __init__(self): + self.v = 0 + + def __iter__(self): + return self + + def __next__(self): + self.v += 1 + if self.v > 5: + raise StopIteration + return self.v + +def gen(): + yield from MyGen() + +def gen2(): + yield from gen() + +print(list(gen())) +print(list(gen2())) + + +class Incrementer: + + def __iter__(self): + return self + + def __next__(self): + return self.send(None) + + def send(self, val): + if val is None: + return "Incrementer initialized" + return val + 1 + +def gen3(): + yield from Incrementer() + +g = gen3() +print(next(g)) +print(g.send(5)) +print(g.send(100)) diff --git a/tests/basics/gen-yield-from-iter.py b/tests/basics/gen-yield-from-iter.py new file mode 100644 index 000000000..2d06328fb --- /dev/null +++ b/tests/basics/gen-yield-from-iter.py @@ -0,0 +1,8 @@ +def gen(): + yield from (1, 2, 3) + +def gen2(): + yield from gen() + +print(list(gen())) +print(list(gen2())) -- cgit v1.2.3