]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-122088: Copy the coroutine status of the underlying callable in `@warnings.depreca...
authorSebastian Rittau <srittau@rittau.biz>
Tue, 23 Jul 2024 09:59:28 +0000 (11:59 +0200)
committerGitHub <noreply@github.com>
Tue, 23 Jul 2024 09:59:28 +0000 (10:59 +0100)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Lib/test/test_warnings/__init__.py
Lib/warnings.py
Misc/NEWS.d/next/Library/2024-07-21-18-03-30.gh-issue-122088.vi2bP-.rst [new file with mode: 0644]

index f9b2b07fbd65767f2a430eb8dab921b2b15b4d00..7d04371c94abda4ec4945e9bb47217a5ffcb3e41 100644 (file)
@@ -1,6 +1,7 @@
 from contextlib import contextmanager
 import linecache
 import os
+import inspect
 from io import StringIO
 import re
 import sys
@@ -1684,6 +1685,29 @@ class DeprecatedTests(unittest.TestCase):
             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()
index d344ceaebb03783be8c3b99edebee830eab7bd9e..e83cde37ab2d1a69dc336ff4ac13b186db7e4827 100644 (file)
@@ -628,12 +628,16 @@ class deprecated:
             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 (file)
index 0000000..9c173d8
--- /dev/null
@@ -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.