|
3 | 3 | import unittest |
4 | 4 | import warnings |
5 | 5 | import weakref |
| 6 | +import inspect |
| 7 | +import types |
6 | 8 |
|
7 | 9 | from test import support |
8 | 10 |
|
@@ -259,6 +261,39 @@ def f(): |
259 | 261 | next(g) |
260 | 262 |
|
261 | 263 |
|
| 264 | +class YieldFromTests(unittest.TestCase): |
| 265 | + def test_generator_gi_yieldfrom(self): |
| 266 | + def a(): |
| 267 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_RUNNING) |
| 268 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 269 | + yield |
| 270 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_RUNNING) |
| 271 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 272 | + |
| 273 | + def b(): |
| 274 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 275 | + yield from a() |
| 276 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 277 | + yield |
| 278 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 279 | + |
| 280 | + gen_b = b() |
| 281 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_CREATED) |
| 282 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 283 | + |
| 284 | + gen_b.send(None) |
| 285 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_SUSPENDED) |
| 286 | + self.assertEqual(gen_b.gi_yieldfrom.gi_code.co_name, 'a') |
| 287 | + |
| 288 | + gen_b.send(None) |
| 289 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_SUSPENDED) |
| 290 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 291 | + |
| 292 | + [] = gen_b # Exhaust generator |
| 293 | + self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_CLOSED) |
| 294 | + self.assertIsNone(gen_b.gi_yieldfrom) |
| 295 | + |
| 296 | + |
262 | 297 | tutorial_tests = """ |
263 | 298 | Let's try a simple generator: |
264 | 299 |
|
@@ -624,7 +659,7 @@ def f(): |
624 | 659 | >>> type(i) |
625 | 660 | <class 'generator'> |
626 | 661 | >>> [s for s in dir(i) if not s.startswith('_')] |
627 | | -['close', 'gi_code', 'gi_frame', 'gi_running', 'send', 'throw'] |
| 662 | +['close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw'] |
628 | 663 | >>> from test.support import HAVE_DOCSTRINGS |
629 | 664 | >>> print(i.__next__.__doc__ if HAVE_DOCSTRINGS else 'Implement next(self).') |
630 | 665 | Implement next(self). |
|
0 commit comments