2010-08-09 14 views
2

Je travaille sur la création d'une extension python c mais j'ai de la difficulté à trouver de la documentation sur ce que je veux faire. Je veux fondamentalement créer un pointeur vers un cstruct et être capable d'avoir accès à ce pointeur. L'exemple de code est ci-dessous. Toute aide serait appréciée.Accéder à la structure sous-jacente d'un PyObject

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  
} 

Répondre

3

Votre PyArg_ParseTuple ne doit pas utiliser le format O mais O! (voir les docs):

O! (object) [typeobject, PyObject *] 

un magasin objet Python dans un pointeur objet C . Ceci est similaire à O, mais prend deux arguments C: le premier est l'adresse d'un objet de type Python, la seconde est l'adresse de la variable C (de type PyObject *) en où le pointeur d'objet est stocké . Si l'objet Python n'a pas le type requis , TypeError est déclenché.

Une fois que vous avez fait cela, vous savez que dans le corps de votre fonction (PointObject*)point sera un pointeur correct et valide à un PointObject, et donc son ->my_point sera le Point* que vous cherchez. Avec un format simple O, vous devriez faire le type de vérification vous-même.

Modifier: l'OP dans un commentaire demande la source ...:

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;-) 
} 
+0

Alex, pourrais-je obtenir la source pour savoir comment faire cela, je suis encore un peu perdu. – Pat

+0

OK, @user, je viens d'éditer mon A pour ajouter le code source que vous demandez. –