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() 需è¦�å�Œæ—¶åœ¨äº§ç”Ÿçš„å…ƒç´ å’Œè¿ä»£å™¨å¯¹è±¡æœ¬èº«ä¸Šå�Œæ—¶è¢«è°ƒç”¨ï¼Œ
以é�¿å…�å‡ºçŽ°å†…å˜æ³„露。