Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Fix iscoroutinefunction() to support mock/proxy obejcts #459

Merged
merged 2 commits into from
Nov 15, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions asyncio/coroutines.py
Original file line number Diff line number Diff line change
@@ -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 @@ def wrapper(*args, **kwds):
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):
2 changes: 2 additions & 0 deletions tests/test_tasks.py
Original file line number Diff line number Diff line change
@@ -1376,6 +1376,8 @@ def fn2():
yield
self.assertTrue(asyncio.iscoroutinefunction(fn2))

self.assertFalse(asyncio.iscoroutinefunction(mock.Mock()))

def test_yield_vs_yield_from(self):
fut = asyncio.Future(loop=self.loop)