[Python-checkins] bpo-36999: Add asyncio.Task.get_coro() (GH-13680)
Miss Islington (bot)
webhook-mailer at python.org
Thu May 30 11:30:17 EDT 2019
https://github.com/python/cpython/commit/98ef92002ec289bf8086b0ef3d4f96c2589f4e68
commit: 98ef92002ec289bf8086b0ef3d4f96c2589f4e68
branch: master
author: Alex Grönholm <alex.gronholm at nextday.fi>
committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
date: 2019-05-30T08:30:09-07:00
summary:
bpo-36999: Add asyncio.Task.get_coro() (GH-13680)
https://bugs.python.org/issue36999
files:
A Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst
M Doc/library/asyncio-task.rst
M Lib/asyncio/tasks.py
M Lib/test/test_asyncio/test_tasks.py
M Modules/_asynciomodule.c
M Modules/clinic/_asynciomodule.c.h
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index d94fa587cd3a..1fcdcb985d88 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -842,6 +842,12 @@ Task Object
The *file* argument is an I/O stream to which the output
is written; by default output is written to :data:`sys.stderr`.
+ .. method:: get_coro()
+
+ Return the coroutine object wrapped by the :class:`Task`.
+
+ .. versionadded:: 3.8
+
.. method:: get_name()
Return the name of the Task.
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 78e76003b3ac..95e85600a2e8 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -152,6 +152,9 @@ def __del__(self):
def _repr_info(self):
return base_tasks._task_repr_info(self)
+ def get_coro(self):
+ return self._coro
+
def get_name(self):
return self._name
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 114dd76687cd..74ce25908a33 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -2425,6 +2425,16 @@ def test_context_3(self):
self.assertEqual(cvar.get(), -1)
+ def test_get_coro(self):
+ loop = asyncio.new_event_loop()
+ coro = coroutine_function()
+ try:
+ task = self.new_task(loop, coro)
+ loop.run_until_complete(task)
+ self.assertIs(task.get_coro(), coro)
+ finally:
+ loop.close()
+
def add_subclass_tests(cls):
BaseTask = cls.Task
diff --git a/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst b/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst
new file mode 100644
index 000000000000..5c897fb4dbc7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst
@@ -0,0 +1,2 @@
+Add the ``asyncio.Task.get_coro()`` method to publicly expose the tasks's
+coroutine object.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index d8b631b7c7a2..281161b68611 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -2313,6 +2313,18 @@ _asyncio_Task_set_exception(TaskObj *self, PyObject *exception)
return NULL;
}
+/*[clinic input]
+_asyncio.Task.get_coro
+[clinic start generated code]*/
+
+static PyObject *
+_asyncio_Task_get_coro_impl(TaskObj *self)
+/*[clinic end generated code: output=bcac27c8cc6c8073 input=d2e8606c42a7b403]*/
+{
+ Py_INCREF(self->task_coro);
+ return self->task_coro;
+}
+
/*[clinic input]
_asyncio.Task.get_name
[clinic start generated code]*/
@@ -2439,6 +2451,7 @@ static PyMethodDef TaskType_methods[] = {
_ASYNCIO_TASK__REPR_INFO_METHODDEF
_ASYNCIO_TASK_GET_NAME_METHODDEF
_ASYNCIO_TASK_SET_NAME_METHODDEF
+ _ASYNCIO_TASK_GET_CORO_METHODDEF
{NULL, NULL} /* Sentinel */
};
diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h
index 87669f7c9f32..b9daee6aae96 100644
--- a/Modules/clinic/_asynciomodule.c.h
+++ b/Modules/clinic/_asynciomodule.c.h
@@ -569,6 +569,23 @@ PyDoc_STRVAR(_asyncio_Task_set_exception__doc__,
#define _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF \
{"set_exception", (PyCFunction)_asyncio_Task_set_exception, METH_O, _asyncio_Task_set_exception__doc__},
+PyDoc_STRVAR(_asyncio_Task_get_coro__doc__,
+"get_coro($self, /)\n"
+"--\n"
+"\n");
+
+#define _ASYNCIO_TASK_GET_CORO_METHODDEF \
+ {"get_coro", (PyCFunction)_asyncio_Task_get_coro, METH_NOARGS, _asyncio_Task_get_coro__doc__},
+
+static PyObject *
+_asyncio_Task_get_coro_impl(TaskObj *self);
+
+static PyObject *
+_asyncio_Task_get_coro(TaskObj *self, PyObject *Py_UNUSED(ignored))
+{
+ return _asyncio_Task_get_coro_impl(self);
+}
+
PyDoc_STRVAR(_asyncio_Task_get_name__doc__,
"get_name($self, /)\n"
"--\n"
@@ -815,4 +832,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
exit:
return return_value;
}
-/*[clinic end generated code: output=e3b02d96da56e80c input=a9049054013a1b77]*/
+/*[clinic end generated code: output=51c50219f6a0863a input=a9049054013a1b77]*/
More information about the Python-checkins
mailing list