diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index 7fda0e449d500a..a20c9058eb8d2f 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -1,6 +1,7 @@ __all__ = 'iscoroutinefunction', 'iscoroutine' import collections.abc +import functools import inspect import os import sys @@ -19,8 +20,11 @@ def _is_debug_mode(): 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) + return ( + inspect.iscoroutinefunction(func) + or getattr(func, '_is_coroutine', None) is _is_coroutine + or getattr(functools._unwrap_partial(func), "_is_coroutine", None) is _is_coroutine + ) # Prioritize native coroutine check to speed-up diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index bde4defdf0129e..1e3dbeef5a7861 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1644,9 +1644,27 @@ def fn1(): yield self.assertFalse(asyncio.iscoroutinefunction(fn1)) - async def fn2(): + def fn2(): pass + + fn2._is_coroutine = asyncio.coroutines._is_coroutine + self.assertTrue(asyncio.iscoroutinefunction(fn2)) + self.assertTrue(asyncio.iscoroutinefunction(functools.partial(fn2))) + self.assertTrue(asyncio.iscoroutinefunction(functools.partial(functools.partial(fn2)))) + + async def async_fn(): + pass + + self.assertTrue(asyncio.iscoroutinefunction(async_fn)) + + def sync_fn(): + pass + + partial_sync_fn = functools.partial(sync_fn) + partial_sync_fn._is_coroutine = asyncio.coroutines._is_coroutine + + self.assertTrue(asyncio.iscoroutinefunction(partial_sync_fn)) self.assertFalse(asyncio.iscoroutinefunction(mock.Mock())) self.assertTrue(asyncio.iscoroutinefunction(mock.AsyncMock())) diff --git a/Misc/NEWS.d/next/Library/2022-07-16-23-53-32.gh-issue-67707.GDOo7t.rst b/Misc/NEWS.d/next/Library/2022-07-16-23-53-32.gh-issue-67707.GDOo7t.rst new file mode 100644 index 00000000000000..c8f053774fe6f1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-07-16-23-53-32.gh-issue-67707.GDOo7t.rst @@ -0,0 +1 @@ +support partials of asyncio coroutine marked functions in asyncio.iscoroutinefunction