https://github.com/python/cpython/commit/7767534df978ab5fb567cc59ee48fea0cbd1db62
commit: 7767534df978ab5fb567cc59ee48fea0cbd1db62
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: AlexWaygood <[email protected]>
date: 2024-07-23T10:24:07Z
summary:

[3.13] gh-122088: Copy the coroutine status of the underlying callable in 
`@warnings.deprecated` (GH-122086) (#122156)

Co-authored-by: Sebastian Rittau <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>

files:
A Misc/NEWS.d/next/Library/2024-07-21-18-03-30.gh-issue-122088.vi2bP-.rst
M Lib/test/test_warnings/__init__.py
M Lib/warnings.py

diff --git a/Lib/test/test_warnings/__init__.py 
b/Lib/test/test_warnings/__init__.py
index 4416ed0f3ed3ef..e7a6f732ee10e8 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -1,6 +1,7 @@
 from contextlib import contextmanager
 import linecache
 import os
+import inspect
 from io import StringIO
 import re
 import sys
@@ -1682,6 +1683,29 @@ def d(): pass
             isinstance(cell.cell_contents, deprecated) for cell in 
d.__closure__
         ))
 
+    def test_inspect(self):
+        @deprecated("depr")
+        def sync():
+            pass
+
+        @deprecated("depr")
+        async def coro():
+            pass
+
+        class Cls:
+            @deprecated("depr")
+            def sync(self):
+                pass
+
+            @deprecated("depr")
+            async def coro(self):
+                pass
+
+        self.assertFalse(inspect.iscoroutinefunction(sync))
+        self.assertTrue(inspect.iscoroutinefunction(coro))
+        self.assertFalse(inspect.iscoroutinefunction(Cls.sync))
+        self.assertTrue(inspect.iscoroutinefunction(Cls.coro))
+
 def setUpModule():
     py_warnings.onceregistry.clear()
     c_warnings.onceregistry.clear()
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 20a39d54bf7e6a..430e4748b973da 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -629,12 +629,16 @@ def __init_subclass__(*args, **kwargs):
             return arg
         elif callable(arg):
             import functools
+            import inspect
 
             @functools.wraps(arg)
             def wrapper(*args, **kwargs):
                 warn(msg, category=category, stacklevel=stacklevel + 1)
                 return arg(*args, **kwargs)
 
+            if inspect.iscoroutinefunction(arg):
+                wrapper = inspect.markcoroutinefunction(wrapper)
+
             arg.__deprecated__ = wrapper.__deprecated__ = msg
             return wrapper
         else:
diff --git 
a/Misc/NEWS.d/next/Library/2024-07-21-18-03-30.gh-issue-122088.vi2bP-.rst 
b/Misc/NEWS.d/next/Library/2024-07-21-18-03-30.gh-issue-122088.vi2bP-.rst
new file mode 100644
index 00000000000000..9c173d8c462feb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-07-21-18-03-30.gh-issue-122088.vi2bP-.rst
@@ -0,0 +1,3 @@
+:func:`@warnings.deprecated <warnings.deprecated>` now copies the
+coroutine status of functions and methods so that
+:func:`inspect.iscoroutinefunction` returns the correct result.

_______________________________________________
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