如何测试PyObject是否有i

2024-06-11 15:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个C函数作为Python的扩展。在abstract.h中,我发现了以下内容:

/* ==== 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 *);

当我试图使用PyObject_GetIter对明显不可iterable的对象(如数字)获取迭代器时,我得到了错误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);
}

我想自己处理错误。所以我试着用PyIter_Check测试对象是否有迭代器。但是,对于我提供的所有对象,包括iterable对象,此函数都返回0。你知道吗

我认为这可能是由PyAPI_FUNC()宏引起的,但我在pyport.h中发现了它,似乎只是在添加__declspec。你知道吗

  • 为什么函数PyIter_Check为所有对象返回零?你知道吗

Tags: and对象函数anobjobjectcheckthis
1条回答
网友
1楼 · 发布于 2024-06-11 15:33:25

PyIter_Check用于检查对象是否是迭代器,而不是它是否能提供迭代器。似乎没有PyIterable_Check。你知道吗

此外,Python几乎强制EAFP:因为任何东西都可以提供引发异常的__iter__,所以无论如何都必须检查来自PyObject_GetIter的错误,所以*_Check函数的唯一一点就是提供早期的健全性检查(有时会有更好的错误消息)。你知道吗

相关问题 更多 >