summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2022-10-07 01:50:25 (GMT)
committerGitHub <noreply@github.com>2022-10-07 01:50:25 (GMT)
commitd163d5976dbb07ed7bc157260ab29452f940b567 (patch)
treee921f91dab49ac6ac51c6a851c6da4ae0cf1bc8a
parentc9d0a7a6bc2f5d5521452790fb4885bb21deca15 (diff)
downloadcpython-d163d5976dbb07ed7bc157260ab29452f940b567.zip
cpython-d163d5976dbb07ed7bc157260ab29452f940b567.tar.gz
cpython-d163d5976dbb07ed7bc157260ab29452f940b567.tar.bz2
GH-90985: Revert "Deprecate passing a message into cancel()" (GH-97999)
Reason: we were too hasty in deprecating this. We shouldn't deprecate it before we have a replacement. (cherry picked from commit 09de8d7aafece264720afbca3052a63eee413b73) Co-authored-by: Guido van Rossum <guido@python.org>
-rw-r--r--Doc/library/asyncio-future.rst10
-rw-r--r--Doc/library/asyncio-task.rst6
-rw-r--r--Lib/asyncio/futures.py6
-rw-r--r--Lib/asyncio/tasks.py5
-rw-r--r--Lib/test/test_asyncio/test_futures.py12
-rw-r--r--Lib/test/test_asyncio/test_tasks.py54
-rw-r--r--Misc/NEWS.d/next/Library/2022-10-06-23-42-00.gh-issue-90985.s280JY.rst1
-rw-r--r--Modules/_asynciomodule.c20
8 files changed, 12 insertions, 102 deletions
diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst
index 8e60877..70cec9b 100644
--- a/Doc/library/asyncio-future.rst
+++ b/Doc/library/asyncio-future.rst
@@ -197,11 +197,6 @@ Future Object
.. versionchanged:: 3.9
Added the *msg* parameter.
- .. deprecated-removed:: 3.11 3.14
- *msg* parameter is ambiguous when multiple :meth:`cancel`
- are called with different cancellation messages.
- The argument will be removed.
-
.. method:: exception()
Return the exception that was set on this Future.
@@ -282,8 +277,3 @@ the Future has a result::
- :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument,
but :func:`concurrent.futures.cancel` does not.
-
- .. deprecated-removed:: 3.11 3.14
- *msg* parameter is ambiguous when multiple :meth:`cancel`
- are called with different cancellation messages.
- The argument will be removed.
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index ade9692..c6b8716 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -1137,10 +1137,8 @@ Task Object
.. versionchanged:: 3.9
Added the *msg* parameter.
- .. deprecated-removed:: 3.11 3.14
- *msg* parameter is ambiguous when multiple :meth:`cancel`
- are called with different cancellation messages.
- The argument will be removed.
+ .. versionchanged:: 3.11
+ The ``msg`` parameter is propagated from cancelled task to its awaiter.
.. _asyncio_example_task_cancel:
diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py
index 39776e3..3a6b44a 100644
--- a/Lib/asyncio/futures.py
+++ b/Lib/asyncio/futures.py
@@ -8,7 +8,6 @@ import concurrent.futures
import contextvars
import logging
import sys
-import warnings
from types import GenericAlias
from . import base_futures
@@ -151,11 +150,6 @@ class Future:
change the future's state to cancelled, schedule the callbacks and
return True.
"""
- if msg is not None:
- warnings.warn("Passing 'msg' argument to Future.cancel() "
- "is deprecated since Python 3.11, and "
- "scheduled for removal in Python 3.14.",
- DeprecationWarning, stacklevel=2)
self.__log_traceback = False
if self._state != _PENDING:
return False
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index e48da0f..3e07ce5 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -207,11 +207,6 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
This also increases the task's count of cancellation requests.
"""
- if msg is not None:
- warnings.warn("Passing 'msg' argument to Task.cancel() "
- "is deprecated since Python 3.11, and "
- "scheduled for removal in Python 3.14.",
- DeprecationWarning, stacklevel=2)
self._log_traceback = False
if self.done():
return False
diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py
index c4c934f..f8fe2e7 100644
--- a/Lib/test/test_asyncio/test_futures.py
+++ b/Lib/test/test_asyncio/test_futures.py
@@ -228,22 +228,14 @@ class BaseFutureTests:
self.assertTrue(hasattr(f, '_cancel_message'))
self.assertEqual(f._cancel_message, None)
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- f.cancel('my message')
+ f.cancel('my message')
with self.assertRaises(asyncio.CancelledError):
self.loop.run_until_complete(f)
self.assertEqual(f._cancel_message, 'my message')
def test_future_cancel_message_setter(self):
f = self._new_future(loop=self.loop)
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- f.cancel('my message')
+ f.cancel('my message')
f._cancel_message = 'my new message'
self.assertEqual(f._cancel_message, 'my new message')
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 1cc2060..7585768 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -113,11 +113,7 @@ class BaseTaskTests:
self.assertTrue(hasattr(t, '_cancel_message'))
self.assertEqual(t._cancel_message, None)
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- t.cancel('my message')
+ t.cancel('my message')
self.assertEqual(t._cancel_message, 'my message')
with self.assertRaises(asyncio.CancelledError) as cm:
@@ -129,11 +125,7 @@ class BaseTaskTests:
async def coro():
pass
t = self.new_task(self.loop, coro())
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- t.cancel('my message')
+ t.cancel('my message')
t._cancel_message = 'my new message'
self.assertEqual(t._cancel_message, 'my new message')
@@ -710,14 +702,7 @@ class BaseTaskTests:
async def coro():
task = self.new_task(loop, sleep())
await asyncio.sleep(0)
- if cancel_args not in ((), (None,)):
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- task.cancel(*cancel_args)
- else:
- task.cancel(*cancel_args)
+ task.cancel(*cancel_args)
done, pending = await asyncio.wait([task])
task.result()
@@ -751,14 +736,7 @@ class BaseTaskTests:
async def coro():
task = self.new_task(loop, sleep())
await asyncio.sleep(0)
- if cancel_args not in ((), (None,)):
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- task.cancel(*cancel_args)
- else:
- task.cancel(*cancel_args)
+ task.cancel(*cancel_args)
done, pending = await asyncio.wait([task])
task.exception()
@@ -781,17 +759,10 @@ class BaseTaskTests:
fut.set_result(None)
await asyncio.sleep(10)
- def cancel(task, msg):
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- task.cancel(msg)
-
async def coro():
inner_task = self.new_task(loop, sleep())
await fut
- loop.call_soon(cancel, inner_task, 'msg')
+ loop.call_soon(inner_task.cancel, 'msg')
try:
await inner_task
except asyncio.CancelledError as ex:
@@ -817,11 +788,7 @@ class BaseTaskTests:
async def coro():
task = self.new_task(loop, sleep())
# We deliberately leave out the sleep here.
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- task.cancel('my message')
+ task.cancel('my message')
done, pending = await asyncio.wait([task])
task.exception()
@@ -2183,14 +2150,7 @@ class BaseTaskTests:
async def main():
qwe = self.new_task(loop, test())
await asyncio.sleep(0.2)
- if cancel_args not in ((), (None,)):
- with self.assertWarnsRegex(
- DeprecationWarning,
- "Passing 'msg' argument"
- ):
- qwe.cancel(*cancel_args)
- else:
- qwe.cancel(*cancel_args)
+ qwe.cancel(*cancel_args)
await qwe
try:
diff --git a/Misc/NEWS.d/next/Library/2022-10-06-23-42-00.gh-issue-90985.s280JY.rst b/Misc/NEWS.d/next/Library/2022-10-06-23-42-00.gh-issue-90985.s280JY.rst
new file mode 100644
index 0000000..964aa39
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-10-06-23-42-00.gh-issue-90985.s280JY.rst
@@ -0,0 +1 @@
+Earlier in 3.11 we deprecated ``asyncio.Task.cancel("message")``. We realized we were too harsh, and have undeprecated it.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 49f1ce3..d503018 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -1116,16 +1116,6 @@ static PyObject *
_asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg)
/*[clinic end generated code: output=3edebbc668e5aba3 input=925eb545251f2c5a]*/
{
- if (msg != Py_None) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing 'msg' argument to Future.cancel() "
- "is deprecated since Python 3.11, and "
- "scheduled for removal in Python 3.14.",
- 2))
- {
- return NULL;
- }
- }
ENSURE_FUTURE_ALIVE(self)
return future_cancel(self, msg);
}
@@ -2206,16 +2196,6 @@ static PyObject *
_asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg)
/*[clinic end generated code: output=c66b60d41c74f9f1 input=7bb51bf25974c783]*/
{
- if (msg != Py_None) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Passing 'msg' argument to Task.cancel() "
- "is deprecated since Python 3.11, and "
- "scheduled for removal in Python 3.14.",
- 2))
- {
- return NULL;
- }
- }
self->task_log_tb = 0;
if (self->task_state != STATE_PENDING) {