15.20 处�C语言中的�迭代对象¶

问题¶

你想写C扩展代�处��自任何�迭代对象如列表�元组�文件或生�器中的元素。

解决方案¶

下�是一个C扩展函数例�,演示了怎样处��迭代对象中的元素:

static PyObject *py_consume_iterable(PyObject *self, PyObject *args) {
  PyObject *obj;
  PyObject *iter;
  PyObject *item;

  if (!PyArg_ParseTuple(args, "O", &obj)) {
    return NULL;
  }
  if ((iter = PyObject_GetIter(obj)) == NULL) {
    return NULL;
  }
  while ((item = PyIter_Next(iter)) != NULL) {
    /* Use item */
    ...
    Py_DECREF(item);
  }

  Py_DECREF(iter);
  return Py_BuildValue("");
}

讨论¶

本节中的代�和Python中对应代�类似。 PyObject_GetIter() 的调用和调用 iter() 一样�获得一个迭代器。 PyIter_Next() 函数调用 next 方法返回下一个元素或NULL(如果没有元素了)。 �注�正确的内存管�—— Py_DECREF() 需��时在产生的元素和迭代器对象本身上�时被调用, 以��出现内存泄露。