diff -r 5621e9a21cc3 Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py Sat May 30 13:54:52 2015 -0400 +++ b/Lib/asyncio/coroutines.py Sat May 30 16:00:16 2015 -0400 @@ -54,9 +54,11 @@ 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 + AwaitableABC = None # Check for CPython issue #21209 @@ -192,6 +194,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: diff -r 5621e9a21cc3 Lib/test/test_asyncio/test_pep492.py --- a/Lib/test/test_asyncio/test_pep492.py Sat May 30 13:54:52 2015 -0400 +++ b/Lib/test/test_asyncio/test_pep492.py Sat May 30 16:00:16 2015 -0400 @@ -106,6 +106,19 @@ self.assertTrue(asyncio.iscoroutine(FakeCoro())) + def test_function_returning_awaitable(self): + class Awaitable: + def __await__(self): + return ('spam',) + + @asyncio.coroutine + def func(): + return Awaitable() + + coro = func() + self.assertEquals(coro.send(None), 'spam') + coro.close() + if __name__ == '__main__': unittest.main()