2010-11-12 12 views
31

dire che ho il mio layout oggetto definito come:Creare un oggetto utilizzando API C di Python

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

... e la mia definizione di tipo:

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

    pyfoo_new, 
}; 

Come si crea una nuova istanza di pyfoo da qualche parte all'interno della mia estensione C?

risposta

33

Chiama PyObject_New(), seguito da PyObject_Init().

EDIT: Il modo migliore è quello di call l'oggetto di classe, proprio come in Python per sé:

/* 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

Sono d'accordo i documenti sono un po 'laconico in quel caso. Ho aggiornato la mia risposta con la chiamata richiesta a 'PyObject_Init()'. –

+0

Attendi, 'PyObject_Init()' non accetta argomenti, quindi come passi gli argomenti di inizializzazione richiesti? – detly

+0

@detly, è necessario chiamare l'oggetto classe. Vedi la mia risposta aggiornata. –

Problemi correlati