From 1c0cf0aef4b43b875b0191fd6f8956c929694a1f Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Sat, 16 Jul 2022 17:44:21 +0100 Subject: [PATCH 1/4] support partials in asyncio.iscoroutinefunction --- Lib/asyncio/coroutines.py | 7 +++++-- Lib/test/test_asyncio/test_tasks.py | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index 7fda0e449d500a..7bd5ba4ba92484 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -19,8 +19,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..31db756fc8bf5b 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(afn2)) + + 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())) From 99c3e0ddd1373ffbfcae767d7c7cefb4510962b2 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Sun, 17 Jul 2022 00:51:42 +0100 Subject: [PATCH 2/4] Update Lib/test/test_asyncio/test_tasks.py --- Lib/test/test_asyncio/test_tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 31db756fc8bf5b..1e3dbeef5a7861 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1656,7 +1656,7 @@ def fn2(): async def async_fn(): pass - self.assertTrue(asyncio.iscoroutinefunction(afn2)) + self.assertTrue(asyncio.iscoroutinefunction(async_fn)) def sync_fn(): pass From d398f4be3983d22944cda06570c7384b374b1f4a Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sat, 16 Jul 2022 23:53:34 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2022-07-16-23-53-32.gh-issue-67707.GDOo7t.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2022-07-16-23-53-32.gh-issue-67707.GDOo7t.rst 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 From 879299a6431d7ca8c2c6321e5451796d36af0a21 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Sun, 17 Jul 2022 01:46:55 +0100 Subject: [PATCH 4/4] import functools for _unwrap_partial --- Lib/asyncio/coroutines.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index 7bd5ba4ba92484..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