您
PyArg_ParseTuple不应该使用格式,
O但是
O!(请参阅文档):
O! (object) [typeobject, PyObject *]
将Python对象存储在C对象指针中。这类似于O,但是有两个C参数:第一个是Python类型对象的地址,第二个是对象指针存储在其中的C变量(PyObject
*类型)的地址。如果Python对象没有所需的类型,则会引发TypeError。
完成此操作后,您将知道在函数的主体
(PointObject*)point中将是a的正确和有效指针
PointObject,因此
->my_point它将成为
Point*您要寻找的对象。使用纯格式时,
O您必须自己检查类型。
编辑 :注释中的OP要求来源…:
static PyObject*set_point(PyObject* self, PyObject* args){ PyObject* point; if (!PyArg_ParseTuple(args, "O!", &PointType, &point)) { return NULL; } Point* pp = ((PointObject*)point)->my_point; // ... use pp as the pointer to Point you were looking for... // ... and incidentally don't forget to return a properly incref'd // PyObject*, of course;-)}


