https://github.com/python/cpython/commit/e472f6d3184e71a496fadc04f755995b736fd595
commit: e472f6d3184e71a496fadc04f755995b736fd595
branch: main
author: sobolevn <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-05-12T22:59:46+05:30
summary:

gh-149600: Remove deprecated `asyncio.iscoroutinefunction` function (#149601)

files:
A Misc/NEWS.d/next/Library/2026-05-09-15-42-54.gh-issue-149600.ZbL-iv.rst
M Doc/whatsnew/3.16.rst
M Lib/asyncio/base_events.py
M Lib/asyncio/coroutines.py
M Lib/asyncio/unix_events.py
M Lib/test/test_asyncio/test_pep492.py
M Lib/test/test_asyncio/test_tasks.py
M Lib/unittest/mock.py

diff --git a/Doc/whatsnew/3.16.rst b/Doc/whatsnew/3.16.rst
index 3c29bda7d1fb86..2db8866da60e0d 100644
--- a/Doc/whatsnew/3.16.rst
+++ b/Doc/whatsnew/3.16.rst
@@ -114,6 +114,13 @@ annotationlib
   Use :meth:`annotationlib.ForwardRef.evaluate`
   or :func:`typing.evaluate_forward_ref` instead.
 
+asyncio
+-------
+
+* The :func:`!asyncio.iscoroutinefunction`
+  which has been deprecated since Python 3.14.
+  Use :func:`inspect.iscoroutinefunction` instead.
+
 functools
 ---------
 
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index 7a6837546d930f..1fedb066f94c53 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -31,6 +31,7 @@
 import traceback
 import warnings
 import weakref
+import inspect
 
 try:
     import ssl
@@ -840,7 +841,7 @@ def call_soon(self, callback, *args, context=None):
 
     def _check_callback(self, callback, method):
         if (coroutines.iscoroutine(callback) or
-                coroutines._iscoroutinefunction(callback)):
+                inspect.iscoroutinefunction(callback)):
             raise TypeError(
                 f"coroutines cannot be used with {method}()")
         if not callable(callback):
diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py
index a51319cb72a6a9..bfffb6da4b19a1 100644
--- a/Lib/asyncio/coroutines.py
+++ b/Lib/asyncio/coroutines.py
@@ -1,4 +1,4 @@
-__all__ = 'iscoroutinefunction', 'iscoroutine'
+__all__ = ('iscoroutine',)
 
 import collections.abc
 import inspect
@@ -13,25 +13,6 @@ def _is_debug_mode():
                                   bool(os.environ.get('PYTHONASYNCIODEBUG')))
 
 
-# A marker for iscoroutinefunction.
-_is_coroutine = object()
-
-
-def iscoroutinefunction(func):
-    import warnings
-    """Return True if func is a decorated coroutine function."""
-    warnings._deprecated("asyncio.iscoroutinefunction",
-                         f"{warnings._DEPRECATED_MSG}; "
-                         "use inspect.iscoroutinefunction() instead",
-                         remove=(3,16))
-    return _iscoroutinefunction(func)
-
-
-def _iscoroutinefunction(func):
-    return (inspect.iscoroutinefunction(func) or
-            getattr(func, '_is_coroutine', None) is _is_coroutine)
-
-
 # Prioritize native coroutine check to speed-up
 # asyncio.iscoroutine.
 _COROUTINE_TYPES = (types.CoroutineType, collections.abc.Coroutine)
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index 49e8067ee7b4e5..915ff845249151 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -12,6 +12,7 @@
 import sys
 import threading
 import warnings
+import inspect
 
 from . import base_events
 from . import base_subprocess
@@ -94,7 +95,7 @@ def add_signal_handler(self, sig, callback, *args):
         Raise RuntimeError if there is a problem setting up the handler.
         """
         if (coroutines.iscoroutine(callback) or
-                coroutines._iscoroutinefunction(callback)):
+                inspect.iscoroutinefunction(callback)):
             raise TypeError("coroutines cannot be used "
                             "with add_signal_handler()")
         self._check_signal(sig)
diff --git a/Lib/test/test_asyncio/test_pep492.py 
b/Lib/test/test_asyncio/test_pep492.py
index a0c8434c9457d2..95a9f3a9a7cf71 100644
--- a/Lib/test/test_asyncio/test_pep492.py
+++ b/Lib/test/test_asyncio/test_pep492.py
@@ -124,11 +124,6 @@ def foo(): yield
 
         self.assertFalse(asyncio.iscoroutine(foo()))
 
-    def test_iscoroutinefunction(self):
-        async def foo(): pass
-        with self.assertWarns(DeprecationWarning):
-            self.assertTrue(asyncio.iscoroutinefunction(foo))
-
     def test_async_def_coroutines(self):
         async def bar():
             return 'spam'
diff --git a/Lib/test/test_asyncio/test_tasks.py 
b/Lib/test/test_asyncio/test_tasks.py
index dc179acd86e8a6..56b1494c8363ca 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -11,6 +11,7 @@
 import traceback
 import types
 import unittest
+import inspect
 from unittest import mock
 from types import GenericAlias
 
@@ -20,7 +21,6 @@
 from test.test_asyncio import utils as test_utils
 from test import support
 from test.support.script_helper import assert_python_ok
-from test.support.warnings_helper import ignore_warnings
 
 
 def tearDownModule():
@@ -1940,30 +1940,11 @@ async def notmutch():
         self.assertFalse(task.cancelled())
         self.assertIs(task.exception(), base_exc)
 
-    @ignore_warnings(category=DeprecationWarning)
-    def test_iscoroutinefunction(self):
-        def fn():
-            pass
-
-        self.assertFalse(asyncio.iscoroutinefunction(fn))
-
-        def fn1():
-            yield
-        self.assertFalse(asyncio.iscoroutinefunction(fn1))
-
-        async def fn2():
-            pass
-        self.assertTrue(asyncio.iscoroutinefunction(fn2))
-
-        self.assertFalse(asyncio.iscoroutinefunction(mock.Mock()))
-        self.assertTrue(asyncio.iscoroutinefunction(mock.AsyncMock()))
-
-    @ignore_warnings(category=DeprecationWarning)
     def test_coroutine_non_gen_function(self):
         async def func():
             return 'test'
 
-        self.assertTrue(asyncio.iscoroutinefunction(func))
+        self.assertTrue(inspect.iscoroutinefunction(func))
 
         coro = func()
         self.assertTrue(asyncio.iscoroutine(coro))
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 1cee67fa5d7094..16f3699e89e77d 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -281,7 +281,6 @@ def reset_mock():
 
 
 def _setup_async_mock(mock):
-    mock._is_coroutine = asyncio.coroutines._is_coroutine
     mock.await_count = 0
     mock.await_args = None
     mock.await_args_list = _CallList()
@@ -2287,13 +2286,6 @@ class AsyncMockMixin(Base):
 
     def __init__(self, /, *args, **kwargs):
         super().__init__(*args, **kwargs)
-        # iscoroutinefunction() checks _is_coroutine property to say if an
-        # object is a coroutine. Without this check it looks to see if it is a
-        # function/method, which in this case it is not (since it is an
-        # AsyncMock).
-        # It is set through __dict__ because when spec_set is True, this
-        # attribute is likely undefined.
-        self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine
         self.__dict__['_mock_await_count'] = 0
         self.__dict__['_mock_await_args'] = None
         self.__dict__['_mock_await_args_list'] = _CallList()
diff --git 
a/Misc/NEWS.d/next/Library/2026-05-09-15-42-54.gh-issue-149600.ZbL-iv.rst 
b/Misc/NEWS.d/next/Library/2026-05-09-15-42-54.gh-issue-149600.ZbL-iv.rst
new file mode 100644
index 00000000000000..732787dc92c109
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-05-09-15-42-54.gh-issue-149600.ZbL-iv.rst
@@ -0,0 +1 @@
+Remove deprecated :func:`!asyncio.iscoroutinefunction` function.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to