From: Serhiy Storchaka Date: Wed, 11 Mar 2015 16:22:29 +0000 (+0200) Subject: Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet. X-Git-Tag: v3.5.0a3~201 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91427733ea26a72a987d66db202ed4ddbb95805f;p=python Issue #23192: Fixed generator lambdas. Patch by Bruno Cauet. --- 91427733ea26a72a987d66db202ed4ddbb95805f diff --cc Lib/test/test_generators.py index 9e610132cd,5c455cdd81..85e09a1f57 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@@ -49,46 -49,27 +49,66 @@@ class FinalizationTest(unittest.TestCas self.assertTrue(finalized) self.assertEqual(gc.garbage, old_garbage) + def test_lambda_generator(self): + # Issue #23192: Test that a lambda returning a generator behaves + # like the equivalent function + f = lambda: (yield 1) + def g(): return (yield 1) + + # test 'yield from' + f2 = lambda: (yield from g()) + def g2(): return (yield from g()) + + f3 = lambda: (yield from f()) + def g3(): return (yield from f()) + + for gen_fun in (f, g, f2, g2, f3, g3): + gen = gen_fun() + self.assertEqual(next(gen), 1) + with self.assertRaises(StopIteration) as cm: + gen.send(2) + self.assertEqual(cm.exception.value, 2) + +class GeneratorTest(unittest.TestCase): + + def test_name(self): + def func(): + yield 1 + + # check generator names + gen = func() + self.assertEqual(gen.__name__, "func") + self.assertEqual(gen.__qualname__, + "GeneratorTest.test_name..func") + + # modify generator names + gen.__name__ = "name" + gen.__qualname__ = "qualname" + self.assertEqual(gen.__name__, "name") + self.assertEqual(gen.__qualname__, "qualname") + + # generator names must be a string and cannot be deleted + self.assertRaises(TypeError, setattr, gen, '__name__', 123) + self.assertRaises(TypeError, setattr, gen, '__qualname__', 123) + self.assertRaises(TypeError, delattr, gen, '__name__') + self.assertRaises(TypeError, delattr, gen, '__qualname__') + + # modify names of the function creating the generator + func.__qualname__ = "func_qualname" + func.__name__ = "func_name" + gen = func() + self.assertEqual(gen.__name__, "func_name") + self.assertEqual(gen.__qualname__, "func_qualname") + + # unnamed generator + gen = (x for x in range(10)) + self.assertEqual(gen.__name__, + "") + self.assertEqual(gen.__qualname__, + "GeneratorTest.test_name..") + + class ExceptionTest(unittest.TestCase): # Tests for the issue #23353: check that the currently handled exception # is correctly saved/restored in PyEval_EvalFrameEx().