Skip to content

Commit 9142773

Browse files
Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet.
2 parents 354ecf1 + c775ad6 commit 9142773

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Lib/test/test_generators.py

+20
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ def gen():
4949
self.assertTrue(finalized)
5050
self.assertEqual(gc.garbage, old_garbage)
5151

52+
def test_lambda_generator(self):
53+
# Issue #23192: Test that a lambda returning a generator behaves
54+
# like the equivalent function
55+
f = lambda: (yield 1)
56+
def g(): return (yield 1)
57+
58+
# test 'yield from'
59+
f2 = lambda: (yield from g())
60+
def g2(): return (yield from g())
61+
62+
f3 = lambda: (yield from f())
63+
def g3(): return (yield from f())
64+
65+
for gen_fun in (f, g, f2, g2, f3, g3):
66+
gen = gen_fun()
67+
self.assertEqual(next(gen), 1)
68+
with self.assertRaises(StopIteration) as cm:
69+
gen.send(2)
70+
self.assertEqual(cm.exception.value, 2)
71+
5272

5373
class GeneratorTest(unittest.TestCase):
5474

Misc/NEWS

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Release date: 2015-03-28
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet.
14+
1315
- Issue #23629: Fix the default __sizeof__ implementation for variable-sized
1416
objects.
1517

Python/compile.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1897,12 +1897,12 @@ compiler_lambda(struct compiler *c, expr_ty e)
18971897
c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
18981898
VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
18991899
if (c->u->u_ste->ste_generator) {
1900-
ADDOP_IN_SCOPE(c, POP_TOP);
1900+
co = assemble(c, 0);
19011901
}
19021902
else {
19031903
ADDOP_IN_SCOPE(c, RETURN_VALUE);
1904+
co = assemble(c, 1);
19041905
}
1905-
co = assemble(c, 1);
19061906
qualname = c->u->u_qualname;
19071907
Py_INCREF(qualname);
19081908
compiler_exit_scope(c);

0 commit comments

Comments
 (0)