为什么以下 Python 代码会引发错误
TypeError: * 之后的类型对象参数必须是一个序列,而不是生成器
而如果我评论生成器 f 中的第一行(无用的),一切正常吗?
from itertools import izip
def z():
for _ in range(10):
yield _
def f(z):
for _ in z: pass # if I comment this line it works! (??)
for x in range(10):
yield (x,10*x,100*x,1000*x)
iterators = izip(*f(z))
for it in iterators:
print list(it)
注意我实际上想做的是,使用单个生成器返回多个迭代器(与我将作为参数传递给生成器的迭代器一样多)。我发现这样做的唯一方法是生成元组并对它们使用 izip() - 对我来说是黑魔法。
最佳答案
这很有趣:当您将它传递给 f
时,您忘记调用 z
:
iterators = izip(*f(z()))
因此 f
尝试迭代一个函数对象:
for _ in z: pass # z is a function
这引发了 TypeError:
TypeError: 'function' object is not iterable
Python 内部人员捕获了它并重新提出了一条令人困惑的错误消息。
# ceval.c
static PyObject *
ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
{
...
t = PySequence_Tuple(stararg);
if (t == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
PyErr_Format(PyExc_TypeError,
"%.200s%.200s argument after * "
"must be a sequence, not %200s",
PyEval_GetFuncName(func),
PyEval_GetFuncDesc(func),
stararg->ob_type->tp_name);
...
关于python - TypeError: * 之后的类型对象参数必须是一个序列,而不是生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15559829/