diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index a49630112af510..45216047d76d57 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -419,6 +419,15 @@ async def gen(): self.assertTrue(inspect.isawaitable(aclose)) aclose.close() + def test_async_gen_ags_gen_agt_gen(self): + async def agen(): + yield 1 + g = agen() + asend = g.asend(1) + self.assertIsInstance(asend.ags_gen, types.AsyncGeneratorType) + athrow = g.athrow() + self.assertIsInstance(athrow.agt_gen, types.AsyncGeneratorType) + class AsyncGenAsyncioTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2018-12-14-12-53-04.bpo-32810.A2g1Cp.rst b/Misc/NEWS.d/next/Library/2018-12-14-12-53-04.bpo-32810.A2g1Cp.rst new file mode 100644 index 00000000000000..cf21c302cd5fa1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-14-12-53-04.bpo-32810.A2g1Cp.rst @@ -0,0 +1,2 @@ +Allow accessing the ``ags_gen`` and ``agt_gen`` attributes of asynchronous +generators. diff --git a/Objects/genobject.c b/Objects/genobject.c index 9614713883741c..60bc75e6911133 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -3,6 +3,7 @@ #define _PY_INTERPRETER #include "Python.h" +#include "structmember.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_EvalFrame() #include "pycore_frame.h" // _PyInterpreterFrame @@ -1848,6 +1849,12 @@ static PyMethodDef async_gen_asend_methods[] = { }; +static PyMemberDef async_gen_asend_memberlist[] = { + {"ags_gen", T_OBJECT, offsetof(PyAsyncGenASend, ags_gen), READONLY}, + {NULL} /* Sentinel */ +}; + + static PyAsyncMethods async_gen_asend_as_async = { PyObject_SelfIter, /* am_await */ 0, /* am_aiter */ @@ -1886,7 +1893,7 @@ PyTypeObject _PyAsyncGenASend_Type = { PyObject_SelfIter, /* tp_iter */ (iternextfunc)async_gen_asend_iternext, /* tp_iternext */ async_gen_asend_methods, /* tp_methods */ - 0, /* tp_members */ + async_gen_asend_memberlist, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ @@ -2279,6 +2286,12 @@ static PyMethodDef async_gen_athrow_methods[] = { }; +static PyMemberDef async_gen_athrow_memberlist[] = { + {"agt_gen", T_OBJECT, offsetof(PyAsyncGenAThrow, agt_gen), READONLY}, + {NULL} /* Sentinel */ +}; + + static PyAsyncMethods async_gen_athrow_as_async = { PyObject_SelfIter, /* am_await */ 0, /* am_aiter */ @@ -2317,7 +2330,7 @@ PyTypeObject _PyAsyncGenAThrow_Type = { PyObject_SelfIter, /* tp_iter */ (iternextfunc)async_gen_athrow_iternext, /* tp_iternext */ async_gen_athrow_methods, /* tp_methods */ - 0, /* tp_members */ + async_gen_athrow_memberlist, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */