2009-09-01 26 views
7

Wenn ein PyObject * auf ein Python-Objekt verweist, wie rufe ich eine der Objektmethoden auf? Die Dokumentation gibt nie ein Beispiel dafür:Aufrufen einer Methode für ein Objekt

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

Dies entspricht

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

Antwort

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

Informieren Sie sich auf der Python C API documentation wäre. In diesem Fall möchten Sie die object protocol.

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

Rückgabewert: Neue Referenz.

Rufen Sie die Methode namens Methode des Objekts o mit einer variablen Anzahl von C Argumente. Die C-Argumente sind beschrieben durch eine Py_BuildValue() Format Zeichenfolge, die ein Tupel erzeugen sollte. Das Format kann NULL sein, das angibt, dass keine Argumente bereitgestellt werden. Gibt das Ergebnis des Anrufs unter Erfolg oder NULL bei Fehler zurück. Dies ist das Äquivalent des Python Ausdruck o.method(args). Beachten Sie, dass , wenn Sie nur passieren PyObject * args, PyObject_CallMethodObjArgs() ist eine schnellere Alternative.

Und

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

Rückgabewert: Neue Referenz.

Ruft eine Methode des Objekts o auf, wobei der Name der Methode als Python-String-Objekt im Namen angegeben wird. Es wird mit einer variablen Nummer PyObject* Argumente aufgerufen. Die Argumente sind , die als eine variable Anzahl von Parametern gefolgt von NULL bereitgestellt werden. Gibt das Ergebnis des Aufrufs bei Erfolg oder NULL bei Fehler zurück.

+0

Zu wissen, was "Object-Protokoll" ist das Problem war. Außerdem suchte ich aus irgendeinem Grund nach einem Aufruf. Vielen Dank. – jmucchiello

3

Ihr Beispiel wäre:

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

Ich kenne seine 7 Jahre zu spät aber was meint der (s) im Format arg? – JMzance

+0

Es ist die gleiche Formatzeichenfolge wie von Py_BuildValue: das Parens bedeutet, dass es ein Tupel erstellt, das s bedeutet, dass das nächste Argument ("An arg") eine C char * Zeichenfolge ist, die in eine Python-Zeichenfolge konvertiert wird. Das Tupel wird als Positionsargument der Funktion verwendet, daher übergeben wir eine Zeichenfolge. –

+0

Was passiert, wenn ich ein c-Array als eine Liste von Strings oder einer Liste von Doubles wie '[' kks ',' sss ',' www ',' sse '] 'oder' [323.9, 32, 443, 434.8,56.6] '? – jaykumarark

Verwandte Themen