Я проверил исходный код для pycurl.CurlMulti.info_read , и он показывает, что:
/* When an error occurs */
else {
/* Create a result tuple that will get added to err_list. */
PyObject *v = Py_BuildValue("(Ois)", (PyObject *)co, (int)msg->data.result, co->error);
/* Append curl object to list of objects which failed */
if (v == NULL || PyList_Append(err_list, v) != 0) {
Py_XDECREF(v);
goto error;
}
Py_DECREF(v);
}
, где co
получено из L781 :
/* Fetch the curl object that corresponds to the curl handle in the message */
res = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char **) &co);
И CURLINFO_PRIVATE
и co->error
установлены в src / easy.c # L52 :
/* Set curl error buffer and zero it */
res = curl_easy_setopt(self->handle, CURLOPT_ERRORBUFFER, self->error);
if (res != CURLE_OK) {
return (-1);
}
memset(self->error, 0, sizeof(self->error));
/* Set backreference */
res = curl_easy_setopt(self->handle, CURLOPT_PRIVATE, (char *) self);
if (res != CURLE_OK) {
return (-1);
}
, что означает, что дано pycurl.Curl
объект не используется повторно для другого соединения или разрушен, поэтому довольно безопасно использовать curl error message
в возвращаемом значении pycurl.CurlMulti.info_read()
.
Этот ответ дает мне еще один интересный факт:
Необязательно устанавливать CURLOPT_PRIVATE
для объекта pycurl.Curl
.