访问PyObject的底层结构

时间:2010-08-09 00:52:24

标签: python c pointers structure

我正在创建一个python c扩展,但很难找到我想要做的文档。我基本上想要创建一个指向cstruct的指针,并能够访问该指针。示例代码如下。任何帮助将不胜感激。

typedef struct{
 int x;
 int y;
} Point;

typedef struct {
 PyObject_HEAD
 Point* my_point;
} PointObject;

static PyTypeObject PointType = {
    PyObject_HEAD_INIT(NULL)
    0,                         /*ob_size*/
    "point",             /*tp_name*/
    sizeof(PointObject), /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    0,                         /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT,        /*tp_flags*/
    "point objects",           /* tp_doc */
};

static PyObject* set_point(PyObject* self, PyObject* args)
{
 PyObject* point; 

 if (!PyArg_ParseTuple(args, "O", &point))
 {
  return NULL;
 }

    //code to access my_point    
}

1 个答案:

答案 0 :(得分:3)

您的PyArg_ParseTuple不应使用格式O,而应使用O!(请参阅文档):

O! (object) [typeobject, PyObject *]
  

将Python对象存储在C对象中   指针。这类似于O,但是   需要两个C参数:第一个是   Python类型对象的地址,   第二个是C的地址   变量(PyObject *类型)到   其中存储了对象指针。如果   Python对象没有   必需的类型,引发TypeError。

完成后,您知道在您的函数正文中(PointObject*)point将是指向PointObject的正确且有效的指针,因此其->my_point将是{{ 1}}你寻求。使用简单格式Point*,您必须自己进行类型检查。

修改:评论中的OP请求来源......:

O