Tôi đang thực hiện một hàm C như một phần mở rộng cho Python. Bên trong abstract.h
, tôi tìm thấy như sau:
/* ==== 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 *);
Khi tôi cố gắng để các trình vòng lặp sử dụng PyObject_GetIter
trên các đối tượng rõ ràng không thể lặp như số, tôi gặp lỗi 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);
}
Tôi muốn tự xử lý lỗi. Vì vậy, tôi đã cố gắng sử dụng PyIter_Check
để kiểm tra nếu đối tượng có một trình vòng lặp. Tuy nhiên, hàm này trả về 0 cho tất cả các đối tượng tôi cung cấp, bao gồm cả các đối tượng lặp.
Tôi nghĩ rằng nó có thể được gây ra bởi PyAPI_FUNC()
macro nhưng tôi đã tìm thấy nó pyport.h
và dường như nó chỉ được thêm vào __declspec
.
- Tại sao hàm
PyIter_Check
trả về 0 cho tất cả các đối tượng?