Estou implementando uma função C como uma extensão para Python. Lá dentro abstract.h, encontrei o seguinte:
/* ==== Iterators ================================================ */
/* Takes an object and returns an iterator for it.
This is typically a new iterator but if the argument is an iterator, this
returns itself. */
PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *);
/* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise.
This function always succeeds. */
PyAPI_FUNC(int) PyIter_Check(PyObject *);
Quando tento fazer com que os iteradores usem PyObject_GetIterobjetos obviamente não iteráveis como um número, recebo o erro SystemError: <built-in function xxx> returned a result with an error set.
static PyObject *my_method(PyObject *self, PyObject *args)
{
PyObject *obj;
PyArg_ParseTuple(args, "O", &obj)
// printf("\ncheck %d",PyIter_Check(obj)); // always 0
PyObject *iter = PyObject_GetIter(obj); // throws error
return PyLong_FromLong(0);
}
Eu gostaria de lidar com os erros sozinho. Então, tentei usar o PyIter_Checkpara testar se o objeto tem um iterador. No entanto, essa função retornou 0 para todos os objetos que forneci, incluindo os iteráveis.
Eu pensei que isso poderia ser causado pela PyAPI_FUNC()macro, mas eu a encontrei pyport.he parece estar apenas adicionando __declspec.
- Por que a função está
PyIter_Checkretornando zero para todos os objetos?