2009-09-01 11 views
7

Dato un oggetto PyObject * che punta a un oggetto python, come faccio a richiamare uno dei metodi dell'oggetto? La documentazione non dà mai un esempio di questo:Invocazione di un metodo su un oggetto

PyObject* obj = .... 
PyObject* args = Py_BuildValue("(s)", "An arg"); 
PyObject* method = PyWHATGOESHERE(obj, "foo"); 
PyObject* ret = PyWHATGOESHERE(obj, method, args); 
if (!ret) { 
    // check error... 
} 

Questo sarebbe l'equivalente di

>>> ret = obj.foo("An arg") 

risposta

7
PyObject* obj = .... 
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
if (!ret) { 
    // check error... 
} 

Leggi sul Python C API documentation. In questo caso, si desidera il object protocol.

PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...) 

Valore restituito: Nuovo riferimento.

Chiamare il metodo denominato metodo dell'oggetto o con un numero variabile di argomenti C . Gli argomenti C sono descritti da una stringa in formato che dovrebbe produrre una tupla. Il formato può essere NULL, indicando che non vengono forniti argomenti. Restituisce il risultato della chiamata sul successo o NULL in caso di errore. Questo è l'equivalente dell'espressione Python o.method(args). Si noti che se si passa solo PyObject * args, PyObject_CallMethodObjArgs() è un'alternativa più rapida .

E

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL) 

Valore restituito: Nuovo riferimento.

Chiama un metodo dell'oggetto o, dove viene assegnato il nome del metodo come oggetto stringa Python nel nome. Si chiama con un numero variabile di argomenti PyObject*. Gli argomenti sono forniti come numero variabile di parametri seguito da NULL. Restituisce il risultato della chiamata in caso di successo oppure NULL in caso di errore.

+0

Sapere cosa "Protocollo oggetto" è stato il problema. Inoltre, stavo cercando invoke per qualche motivo. Grazie. – jmucchiello

3

tuo esempio potrebbe essere:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
+0

Conosco i suoi 7 anni di ritardo ma cosa significa il (s) nel formato arg.? – JMzance

+0

È la stessa stringa di formato utilizzata da Py_BuildValue: il paren significa che costruirà una tupla, il s significa che l'argomento successivo ("An arg") sarà una stringa C char *, convertita in una stringa Python. La tupla viene utilizzata come argomento posizionale della funzione, quindi stiamo passando una stringa. –

+0

Cosa succede se voglio passare un array c come una lista di stringhe o liste di doppi come, '['kks', 'sss', 'www', 'sse']' o '[323.9, 32, 443, 434.8,56.6] '? – jaykumarark