Ich implementiere eine C-Funktion als Erweiterung für Python. Im Inneren abstract.h
fand ich Folgendes:
/* ==== 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 *);
Wenn ich versuche, Iteratoren PyObject_GetIter
für offensichtlich nicht iterierbare Objekte wie eine Zahl zu verwenden, wird der Fehler angezeigt 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);
}
Ich möchte Fehler selbst behandeln. Also habe ich versucht, mit dem PyIter_Check
zu testen, ob das Objekt einen Iterator hat. Diese Funktion gab jedoch 0 für alle von mir bereitgestellten Objekte zurück, einschließlich der iterierbaren.
Ich dachte, dass es durch das PyAPI_FUNC()
Makro verursacht werden könnte, aber ich fand es in pyport.h
und es scheint nur hinzuzufügen __declspec
.
- Warum gibt die Funktion
PyIter_Check
für alle Objekte Null zurück?
Py_DECREF
s für vorhandene Referenzen kann man normalerweise nur sagenPyObject *const x=Py_Foo(…); if(!x) return 0;
.