Pythonの拡張機能としてC関数を実装しています。の中では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
がすべてのオブジェクトに対してゼロを返すのはなぜですか?