Skip to content

Commit

Permalink
pythongh-122088: Copy the coroutine status of the underlying callable…
Browse files Browse the repository at this point in the history
… in `@warnings.deprecated` (python#122086)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
  • Loading branch information
2 people authored and nohlson committed Jul 24, 2024
1 parent fa1db5c commit 4bcd788
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
24 changes: 24 additions & 0 deletions Lib/test/test_warnings/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from contextlib import contextmanager
import linecache
import os
import inspect
from io import StringIO
import re
import sys
Expand Down Expand Up @@ -1684,6 +1685,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()
Expand Down
4 changes: 4 additions & 0 deletions Lib/warnings.py
Original file line number Diff line number Diff line change
Expand Up @@ -628,12 +628,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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 4bcd788

Please sign in to comment.