diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 9afda220bd7..a3cf379ee81 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -103,6 +103,9 @@ class Future: context['source_traceback'] = self._source_traceback self._loop.call_exception_handler(context) + def __class_getitem__(cls, type): + return cls + @property def _log_traceback(self): return self.__log_traceback diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 390ae9a6821..cd3f7c6a567 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -76,6 +76,9 @@ class Queue: def __str__(self): return f'<{type(self).__name__} {self._format()}>' + def __class_getitem__(cls, type): + return cls + def _format(self): result = f'maxsize={self._maxsize!r}' if getattr(self, '_queue', None): diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 38d982716d4..894d28eb107 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -175,6 +175,9 @@ class Task(futures._PyFuture): # Inherit Python Task implementation self._loop.call_exception_handler(context) super().__del__() + def __class_getitem__(cls, type): + return cls + def _repr_info(self): return base_tasks._task_repr_info(self) diff --git a/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst b/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst new file mode 100644 index 00000000000..8b2eab0d52a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst @@ -0,0 +1,2 @@ +Implement ``__class_getitem__`` on asyncio objects (Future, Task, Queue). +Patch by Batuhan Taskaya. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index aa46e3cf564..2d147447ab7 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1381,6 +1381,12 @@ finally: PyErr_Restore(error_type, error_value, error_traceback); } +static PyObject * +future_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} static PyAsyncMethods FutureType_as_async = { (unaryfunc)future_new_iter, /* am_await */ @@ -1400,6 +1406,7 @@ static PyMethodDef FutureType_methods[] = { _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_FUTURE_GET_LOOP_METHODDEF _ASYNCIO_FUTURE__REPR_INFO_METHODDEF + {"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -2429,6 +2436,13 @@ done: FutureObj_finalize((FutureObj*)task); } +static PyObject * +task_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} + static void TaskObj_dealloc(PyObject *); /* Needs Task_CheckExact */ static PyMethodDef TaskType_methods[] = { @@ -2449,6 +2463,7 @@ static PyMethodDef TaskType_methods[] = { _ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF _ASYNCIO_TASK_GET_CORO_METHODDEF + {"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ };