Issue 24004: Support Awaitables (pep 492) in @asyncio.coroutine decorator

(Merge 3.5)
This commit is contained in:
Yury Selivanov 2015-05-30 21:02:49 -04:00
commit f525e5fb3e
1 changed files with 13 additions and 2 deletions

View File

@ -54,9 +54,10 @@ else:
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 @@ def coroutine(func):
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: