gpt4 book ai didi

python - 如何测试 PyObject 是否有迭代器

转载 作者:行者123 更新时间:2023-12-02 03:07:56 25 4
gpt4 key购买 nike

我正在实现一个 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 获取迭代器时对于明显不可迭代的对象(例如数字),我收到错误 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测试对象是否有迭代器。但是,该函数对于我提供的所有对象(包括可迭代对象)都返回 0。

我认为这可能是由PyAPI_FUNC()引起的宏,但我在 pyport.h 中找到了它它似乎只是添加 __declspec .

  • 为什么这个函数是PyIter_Check为所有对象返回零?

最佳答案

PyIter_Check 用于检查对象是否迭代器,而不是它是否可以提供迭代器。似乎没有 PyIterable_Check

此外,Python 几乎强制执行 EAFP:因为任何东西都可以提供引发异常的 __iter__,因此您无论如何都必须检查 PyObject_GetIter 中的错误,因此唯一的方法是*_Check 函数的要点是提供早期健全性检查(有时提供更好的错误消息)。

关于python - 如何测试 PyObject 是否有迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59143577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com