[Python-checkins] cpython (3.4): Issue 24004: Support Awaitables (pep 492) in @asyncio.coroutine decorator

yury.selivanov python-checkins at python.org
Sun May 31 03:02:57 CEST 2015


https://hg.python.org/cpython/rev/b7b73029c825
changeset:   96410:b7b73029c825
branch:      3.4
parent:      96390:943fa0e8b6a4
user:        Yury Selivanov <yselivanov at sprymix.com>
date:        Sat May 30 21:02:12 2015 -0400
summary:
  Issue 24004: Support Awaitables (pep 492) in @asyncio.coroutine decorator

files:
  Lib/asyncio/coroutines.py |  15 +++++++++++++--
  1 files changed, 13 insertions(+), 2 deletions(-)


diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py
--- a/Lib/asyncio/coroutines.py
+++ b/Lib/asyncio/coroutines.py
@@ -54,9 +54,10 @@
                                          inspect.CO_COROUTINE)
 
 try:
-    from collections.abc import Coroutine as CoroutineABC
+    from collections.abc import Coroutine as CoroutineABC, \
+                                Awaitable as AwaitableABC
 except ImportError:
-    CoroutineABC = None
+    CoroutineABC = AwaitableABC = None
 
 
 # Check for CPython issue #21209
@@ -192,6 +193,16 @@
             res = func(*args, **kw)
             if isinstance(res, futures.Future) or inspect.isgenerator(res):
                 res = yield from res
+            elif AwaitableABC is not None:
+                # If 'func' returns an Awaitable (new in 3.5) we
+                # want to run it.
+                try:
+                    await_meth = res.__await__
+                except AttributeError:
+                    pass
+                else:
+                    if isinstance(res, AwaitableABC):
+                        res = yield from await_meth()
             return res
 
     if not _DEBUG:

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list