From f15f7484bb2265ae46b227c9ddb2300958e93e3f Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Mon, 14 Apr 2014 22:21:52 -0400 Subject: [PATCH 1/2] asyncio.tasks: Fix CoroWrapper to workaround yield-from bug in CPython < 3.4.1 Closes issue #21209. --- Lib/asyncio/tasks.py | 5 ++++- Lib/test/test_asyncio/test_tasks.py | 25 +++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 153f731a76d..0366da35fee 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -49,7 +49,10 @@ class CoroWrapper: 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): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index ced34312f79..45de8acc1a3 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1386,6 +1386,31 @@ class TaskTests(unittest.TestCase): 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): diff --git a/Misc/NEWS b/Misc/NEWS index 8519b6196ce..9cdc6059c15 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 ---- From 9417764e0164711886ee5416204b59ec47ef54c7 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Mon, 14 Apr 2014 22:22:36 -0400 Subject: [PATCH 2/2] misc.news: Remove whitespace --- Misc/NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index 9cdc6059c15..45401d6cd8a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,7 +30,7 @@ Core and Builtins - Issue #12546: Allow \x00 to be used as a fill character when using str, int, float, and complex __format__ methods. -- Issue #13598: Modify string.Formatter to support auto-numbering of +- Issue #13598: Modify string.Formatter to support auto-numbering of replacement fields. It now matches the behavior of str.format() in this regard. Patches by Phil Elson and Ramchandra Apte.