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]