(original) (raw)
changeset: 96412:6c53591d589b parent: 96409:673dc0b8a402 parent: 96411:d1959cafc68c user: Yury Selivanov yselivanov@sprymix.com date: Sat May 30 21:02:49 2015 -0400 description: Issue 24004: Support Awaitables (pep 492) in @asyncio.coroutine decorator (Merge 3.5) diff -r 673dc0b8a402 -r 6c53591d589b Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py Sat May 30 17:28:56 2015 -0700 +++ b/Lib/asyncio/coroutines.py Sat May 30 21:02:49 2015 -0400 @@ -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: /yselivanov@sprymix.com