diff --git a/Lib/inspect.py b/Lib/inspect.py index ff462750888c88..237f8a522469b7 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -317,6 +317,7 @@ def markcoroutinefunction(func): """ if hasattr(func, '__func__'): func = func.__func__ + func = functools._unwrap_partial(func) func._is_coroutine_marker = _is_coroutine_mark return func diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index dd3b7d9c5b4b5b..2085111015b644 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -334,6 +334,17 @@ def do_something_static(): self.assertTrue(inspect.iscoroutinefunction(Cl3.do_something_classy)) self.assertTrue(inspect.iscoroutinefunction(Cl3.do_something_static)) + # Test markcoroutinefunction with functools.partial + async def _fn4(): + pass + + def fn4(): + return _fn4() + + partial_fn4 = functools.partial(fn4) + marked_partial_fn4 = inspect.markcoroutinefunction(partial_fn4) + self.assertTrue(inspect.iscoroutinefunction(marked_partial_fn4)) + self.assertFalse( inspect.iscoroutinefunction(unittest.mock.Mock())) self.assertTrue( diff --git a/Misc/NEWS.d/next/Library/2025-12-10-02-31-08.gh-issue-142418.XLGNh3.rst b/Misc/NEWS.d/next/Library/2025-12-10-02-31-08.gh-issue-142418.XLGNh3.rst new file mode 100644 index 00000000000000..28e273fe166beb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-10-02-31-08.gh-issue-142418.XLGNh3.rst @@ -0,0 +1,2 @@ +Fix markcoroutinefunction by letting it set the coroutine function marker on +underlying function correctly.