bpo-38978: Implement __class_getitem__ for asyncio objects (GH-17491)

https://bugs.python.org/issue38978
This commit is contained in:
Batuhan Taşkaya 2019-12-07 14:05:07 +03:00 committed by Miss Islington (bot)
parent 723f71abf7
commit dec367261e
5 changed files with 26 additions and 0 deletions

View File

@ -103,6 +103,9 @@ class Future:
context['source_traceback'] = self._source_traceback context['source_traceback'] = self._source_traceback
self._loop.call_exception_handler(context) self._loop.call_exception_handler(context)
def __class_getitem__(cls, type):
return cls
@property @property
def _log_traceback(self): def _log_traceback(self):
return self.__log_traceback return self.__log_traceback

View File

@ -76,6 +76,9 @@ class Queue:
def __str__(self): def __str__(self):
return f'<{type(self).__name__} {self._format()}>' return f'<{type(self).__name__} {self._format()}>'
def __class_getitem__(cls, type):
return cls
def _format(self): def _format(self):
result = f'maxsize={self._maxsize!r}' result = f'maxsize={self._maxsize!r}'
if getattr(self, '_queue', None): if getattr(self, '_queue', None):

View File

@ -175,6 +175,9 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
self._loop.call_exception_handler(context) self._loop.call_exception_handler(context)
super().__del__() super().__del__()
def __class_getitem__(cls, type):
return cls
def _repr_info(self): def _repr_info(self):
return base_tasks._task_repr_info(self) return base_tasks._task_repr_info(self)

View File

@ -0,0 +1,2 @@
Implement ``__class_getitem__`` on asyncio objects (Future, Task, Queue).
Patch by Batuhan Taskaya.

View File

@ -1381,6 +1381,12 @@ finally:
PyErr_Restore(error_type, error_value, error_traceback); 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 = { static PyAsyncMethods FutureType_as_async = {
(unaryfunc)future_new_iter, /* am_await */ (unaryfunc)future_new_iter, /* am_await */
@ -1400,6 +1406,7 @@ static PyMethodDef FutureType_methods[] = {
_ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_FUTURE_DONE_METHODDEF
_ASYNCIO_FUTURE_GET_LOOP_METHODDEF _ASYNCIO_FUTURE_GET_LOOP_METHODDEF
_ASYNCIO_FUTURE__REPR_INFO_METHODDEF _ASYNCIO_FUTURE__REPR_INFO_METHODDEF
{"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL},
{NULL, NULL} /* Sentinel */ {NULL, NULL} /* Sentinel */
}; };
@ -2429,6 +2436,13 @@ done:
FutureObj_finalize((FutureObj*)task); 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 void TaskObj_dealloc(PyObject *); /* Needs Task_CheckExact */
static PyMethodDef TaskType_methods[] = { static PyMethodDef TaskType_methods[] = {
@ -2449,6 +2463,7 @@ static PyMethodDef TaskType_methods[] = {
_ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_GET_NAME_METHODDEF
_ASYNCIO_TASK_SET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF
_ASYNCIO_TASK_GET_CORO_METHODDEF _ASYNCIO_TASK_GET_CORO_METHODDEF
{"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL},
{NULL, NULL} /* Sentinel */ {NULL, NULL} /* Sentinel */
}; };