2009-09-01 17 views
7

Dado un PyObject * que apunta a un objeto python, ¿cómo invoco uno de los métodos objeto? La documentación nunca se da un ejemplo de esto:Invocación de un método en un objeto

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

Esto sería el equivalente de

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

Respuesta

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

Lea sobre la Python C API documentation. En este caso, quiere el object protocol.

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

Valor de retorno: Nueva referencia.

Llamar al método denominado método del objeto o con un número variable de argumentos C . Los argumentos C son descritos por un Py_BuildValue() formato cadena que debe producir una tupla. El formato puede ser NULL, indicando que no se proporcionan argumentos. Devuelve el resultado de la llamada al éxito o NULL en caso de error. Esto es el equivalente de la expresión Python o.method(args). Tenga en cuenta que si solo pasa PyObject * args, PyObject_CallMethodObjArgs() es una alternativa más rápida .

Y

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

Valor de retorno: Nueva referencia.

Llama a un método del objeto o, donde el nombre del método se da como un objeto de cadena Python en el nombre. Se llama a con un número variable de PyObject* argumentos. Los argumentos son proporcionados como un número variable de parámetros seguidos por NULL. Devuelve el resultado de la llamada en caso de éxito, o NULL en caso de error.

+0

Saber qué "protocolo de objeto" es el problema. Además, estaba buscando una invocación por algún motivo. Gracias. – jmucchiello

3

Su ejemplo sería:

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

Sé que es 7 años demasiado tarde, pero ¿qué significa la (s) en el formato arg.? – JMzance

+0

Es la misma cadena de formato utilizada por Py_BuildValue: los parens significan que construirá una tupla, la s significa que el siguiente argumento ("An arg") será una cadena C char *, convertida en una cadena de Python. La tupla se utiliza como argumentos posicionales de la función, por lo que estamos pasando una cadena. –

+0

¿Qué pasa si quiero pasar una matriz c como una lista de cadenas o lista de dobles como, '['kks', 'sss', 'www', 'sse']' o '[323.9, 32, 443, 434.8,56.6] '? – jaykumarark

Cuestiones relacionadas