Commit a3160851 authored by Yury Selivanov's avatar Yury Selivanov

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

parent 03395687
...@@ -54,9 +54,10 @@ else: ...@@ -54,9 +54,10 @@ else:
inspect.CO_COROUTINE) inspect.CO_COROUTINE)
try: try:
from collections.abc import Coroutine as CoroutineABC from collections.abc import Coroutine as CoroutineABC, \
Awaitable as AwaitableABC
except ImportError: except ImportError:
CoroutineABC = None CoroutineABC = AwaitableABC = None
# Check for CPython issue #21209 # Check for CPython issue #21209
...@@ -192,6 +193,16 @@ def coroutine(func): ...@@ -192,6 +193,16 @@ def coroutine(func):
res = func(*args, **kw) res = func(*args, **kw)
if isinstance(res, futures.Future) or inspect.isgenerator(res): if isinstance(res, futures.Future) or inspect.isgenerator(res):
res = yield from 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 return res
if not _DEBUG: if not _DEBUG:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment