mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	asyncio.tasks: Fix CoroWrapper to workaround yield-from bug in CPython < 3.4.1
Closes issue #21209.
This commit is contained in:
		
							parent
							
								
									cfdd0161ac
								
							
						
					
					
						commit
						f15f7484bb
					
				
					 3 changed files with 32 additions and 1 deletions
				
			
		|  | @ -49,7 +49,10 @@ def __iter__(self): | |||
|     def __next__(self): | ||||
|         return next(self.gen) | ||||
| 
 | ||||
|     def send(self, value): | ||||
|     def send(self, *value): | ||||
|         # We use `*value` because of a bug in CPythons prior | ||||
|         # to 3.4.1. See issue #21209 and test_yield_from_corowrapper | ||||
|         # for details.  This workaround should be removed in 3.5.0. | ||||
|         return self.gen.send(value) | ||||
| 
 | ||||
|     def throw(self, exc): | ||||
|  |  | |||
|  | @ -1386,6 +1386,31 @@ def test_wait_invalid_args(self): | |||
|         self.assertRaises(ValueError, self.loop.run_until_complete, | ||||
|             asyncio.wait([], loop=self.loop)) | ||||
| 
 | ||||
|     def test_yield_from_corowrapper(self): | ||||
|         old_debug = asyncio.tasks._DEBUG | ||||
|         asyncio.tasks._DEBUG = True | ||||
|         try: | ||||
|             @asyncio.coroutine | ||||
|             def t1(): | ||||
|                 return (yield from t2()) | ||||
| 
 | ||||
|             @asyncio.coroutine | ||||
|             def t2(): | ||||
|                 f = asyncio.Future(loop=self.loop) | ||||
|                 asyncio.Task(t3(f), loop=self.loop) | ||||
|                 return (yield from f) | ||||
| 
 | ||||
|             @asyncio.coroutine | ||||
|             def t3(f): | ||||
|                 f.set_result((1, 2, 3)) | ||||
| 
 | ||||
|             task = asyncio.Task(t1(), loop=self.loop) | ||||
|             val = self.loop.run_until_complete(task) | ||||
|             self.assertEqual(val, (1, 2, 3)) | ||||
|         finally: | ||||
|             asyncio.tasks._DEBUG = old_debug | ||||
| 
 | ||||
| 
 | ||||
| class GatherTestsBase: | ||||
| 
 | ||||
|     def setUp(self): | ||||
|  |  | |||
|  | @ -147,6 +147,9 @@ Library | |||
|   positional-or-keyword arguments passed as keyword arguments become | ||||
|   keyword-only. | ||||
| 
 | ||||
| - Issue #21209: Fix asyncio.tasks.CoroWrapper to workaround a bug | ||||
|   in yield-from implementation in CPythons prior to 3.4.1. | ||||
| 
 | ||||
| IDLE | ||||
| ---- | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yury Selivanov
						Yury Selivanov