changeset: 105133:298c53e2461f parent: 105130:a3de2d0f49ea parent: 105132:4d78290b1d8e user: Yury Selivanov date: Tue Nov 15 15:21:34 2016 -0500 files: Misc/NEWS description: Merge 3.6 (issue #28703) diff -r a3de2d0f49ea -r 298c53e2461f Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py Tue Nov 15 09:48:12 2016 -0800 +++ b/Lib/asyncio/coroutines.py Tue Nov 15 15:21:34 2016 -0500 @@ -33,12 +33,16 @@ try: _types_coroutine = types.coroutine + _types_CoroutineType = types.CoroutineType except AttributeError: + # Python 3.4 _types_coroutine = None + _types_CoroutineType = None try: _inspect_iscoroutinefunction = inspect.iscoroutinefunction except AttributeError: + # Python 3.4 _inspect_iscoroutinefunction = lambda func: False try: @@ -238,19 +242,27 @@ w.__qualname__ = getattr(func, '__qualname__', None) return w - wrapper._is_coroutine = True # For iscoroutinefunction(). + wrapper._is_coroutine = _is_coroutine # For iscoroutinefunction(). return wrapper +# A marker for iscoroutinefunction. +_is_coroutine = object() + + def iscoroutinefunction(func): """Return True if func is a decorated coroutine function.""" - return (getattr(func, '_is_coroutine', False) or + return (getattr(func, '_is_coroutine', None) is _is_coroutine or _inspect_iscoroutinefunction(func)) _COROUTINE_TYPES = (types.GeneratorType, CoroWrapper) if _CoroutineABC is not None: _COROUTINE_TYPES += (_CoroutineABC,) +if _types_CoroutineType is not None: + # Prioritize native coroutine check to speed-up + # asyncio.iscoroutine. + _COROUTINE_TYPES = (_types_CoroutineType,) + _COROUTINE_TYPES def iscoroutine(obj): diff -r a3de2d0f49ea -r 298c53e2461f Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py Tue Nov 15 09:48:12 2016 -0800 +++ b/Lib/test/test_asyncio/test_tasks.py Tue Nov 15 15:21:34 2016 -0500 @@ -1390,6 +1390,8 @@ yield self.assertTrue(asyncio.iscoroutinefunction(fn2)) + self.assertFalse(asyncio.iscoroutinefunction(mock.Mock())) + def test_yield_vs_yield_from(self): fut = self.new_future(self.loop)