Доступ к базовой структуре PyObject - PullRequest
2 голосов
/ 09 августа 2010

Я работаю над созданием расширения 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 Ответ

3 голосов
/ 09 августа 2010

Ваш PyArg_ParseTuple не должен использовать формат O, но O! (см. Документы):

O! (object) [typeobject, PyObject *]

Сохранять объект Python в указателе объекта C.Это похоже на O, но принимает два аргумента C: первый - это адрес объекта типа Python, второй - адрес переменной C (типа PyObject *), в которой хранится указатель объекта.Если объект Python не имеет требуемого типа, вызывается TypeError.

Как только вы это сделаете, вы знаете, что в теле вашей функции (PointObject*)point будет правильным и действительным указателем наPointObject, и, следовательно, ->my_point будет Point*, который вы ищете.В простом формате O вам придется самостоятельно проверять тип.

Редактировать : ОП в комментариях запрашивает источник ...:

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;-)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...