gh-72889: remove redundant mock.Mock()._is_coroutine = False workarounds by graingert · Pull Request #94926 · python/cpython (original) (raw)

when asyncio.iscoroutinefunction was implemented as:

def iscoroutinefunction(func):
"""Return True if func is a decorated coroutine function."""
return (getattr(func, '_is_coroutine', False) or
_inspect_iscoroutinefunction(func))

this meant

self.loop._add_reader = mock.Mock() assert asyncio.iscoroutinefunction(self.loop._add_reader) is True # mock objects have a truthy _is_coroutine attribute! self.loop._add_reader._is_coroutine = False assert asyncio.iscoroutinefunction(self.loop._add_reader) is False # patching it works around the issue

however the implementation was changed to use a marker object:

# A marker for iscoroutinefunction.
_is_coroutine = object()
def iscoroutinefunction(func):
"""Return True if func is a decorated coroutine function."""
return (inspect.iscoroutinefunction(func) or
getattr(func, '_is_coroutine', None) is _is_coroutine)

and so now the _is_coroutine = False work-around is redundant:

self.loop._add_reader = mock.Mock() assert asyncio.iscoroutinefunction(self.loop._add_reader) is False # mock objects have an _is_coroutine but it's not the asyncio.coroutines._is_coroutine sentinel self.loop._add_reader._is_coroutine = False assert asyncio.iscoroutinefunction(self.loop._add_reader) is False # it's still False so the workaround is redundant