Hi, I find it weird that given this sample code: def g(): yield iter(None) list(*g()) I get this traceback: Traceback (most recent call last): File "a1.py", line 3, in list(*g()) TypeError: type object argument after * must be a sequence, not generator At a minimum the exception message looks awkward to me. With the proposed patch, the new traceback would be: Traceback (most recent call last): File "a1.py", line 3, in list(*g()) File "a1.py", line 2, in g yield iter(None) TypeError: 'NoneType' object is not iterable
You must check tp_iter as well, not only Py_TPFLAGS_HAVE_ITER. Py_TPFLAGS_HAVE_ITER only tells you that the tp_iter field exists, not that it's non-NULL. (see the code for PyObject_GetIter() in Objects/abstract.c for an example)
Thanks for taking a look, my bad for taking so long to reply. I'm adding a new patch now. This one, besides the fix needed mentioned above, disregards tp_iter from old class instances (since they are always available and tell us nothing).