2010-11-12 17 views
31

dire que j'ai ma mise en page de l'objet défini comme:Créer un objet en utilisant l'API C Python

typedef struct { 
    PyObject_HEAD 
    // Other stuff... 
} pyfoo; 

... et ma définition de type:

static PyTypeObject pyfoo_T = { 
    PyObject_HEAD_INIT(NULL) 
    // ... 

    pyfoo_new, 
}; 

Comment puis-je créer une nouvelle instance de pyfoo quelque part dans mon extension C?

Répondre

33

Appelez PyObject_New(), suivi de PyObject_Init().

EDIT: La meilleure façon est de call l'objet de classe, tout comme en Python lui-même:

/* Pass two arguments, a string and an int. */ 
PyObject *argList = Py_BuildValue("si", "hello", 42); 

/* Call the class object. */ 
PyObject *obj = PyObject_CallObject((PyObject *) &pyfoo_T, argList); 

/* Release the argument list. */ 
Py_DECREF(argList); 
+2

Je suis d'accord les docs sont un peu laconique dans ce cas. J'ai mis à jour ma réponse avec l'appel requis à 'PyObject_Init()'. –

+0

Attendez, 'PyObject_Init()' ne prend aucun argument, alors comment passez-vous les arguments d'initialisation requis? – detly

+0

@detly, vous devez appeler l'objet de classe. Voir ma réponse mise à jour. –