Skip to content

Commit 6145c26

Browse files
Merge pull request #7 from johnslavik/hyperawait-secret-conspiracy
Fix `yield from` not working on non-iterator iterables inside async generators
2 parents 24603b1 + c3b318e commit 6145c26

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

Objects/genobject.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2716,24 +2716,23 @@ PyTypeObject _PyAsyncGenYieldFrom_Type = {
27162716

27172717

27182718
PyObject *
2719-
_PyAsyncGenYieldFrom_New(PyThreadState *tstate, PyObject *iterator)
2719+
_PyAsyncGenYieldFrom_New(PyThreadState *tstate, PyObject *iterable)
27202720
{
27212721
assert(tstate != NULL);
2722-
assert(iterator != NULL);
2722+
assert(iterable != NULL);
27232723
_PyAsyncGenYieldFrom *yield_from = PyObject_GC_New(_PyAsyncGenYieldFrom,
27242724
&_PyAsyncGenYieldFrom_Type);
27252725
if (yield_from == NULL) {
27262726
return NULL;
27272727
}
2728-
if (!PyIter_Check(iterator)) {
2729-
if (PyAsyncGen_CheckExact(iterator)) {
2730-
_PyErr_Format(tstate, PyExc_TypeError,
2731-
"%T object is not iterable. Did you mean 'async yield from'?",
2732-
iterator);
2733-
} else {
2734-
_PyErr_Format(tstate, PyExc_TypeError,
2735-
"%T object is not iterable", iterator);
2736-
}
2728+
if (!Py_TYPE(iterable)->tp_iter && PyAsyncGen_CheckExact(iterable)) {
2729+
_PyErr_Format(tstate, PyExc_TypeError,
2730+
"%T object is not iterable. Did you mean 'async yield from'?",
2731+
iterable);
2732+
return NULL;
2733+
}
2734+
PyObject *iterator = PyObject_GetIter(iterable);
2735+
if (iterator == NULL) {
27372736
return NULL;
27382737
}
27392738
yield_from->agyf_iterator = Py_NewRef(iterator);

0 commit comments

Comments
 (0)