gh-72889: remove redundant `mock.Mock()._is_coroutine = False` workarounds by graingert · Pull Request #94926 · python/cpython
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