2009-09-01 114 views
7

给定一个指向python对象的PyObject *,我该如何调用其中一个对象方法?该文件从来没有给这样一个例子:在对象上调用方法

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

这将是

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

回答

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

等同于Python C API documentation阅读起来。在这种情况下,您需要object protocol

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

返回值:新基准。

调用变量号为C 参数的对象o的方法名为method。 C参数为 ,由Py_BuildValue()格式描述 应产生元组的字符串。 格式可能是NULL,表示 没有提供参数。 返回调用结果 成功,或NULL失败。这是 相当于Python 表达式o.method(args)。请注意, 如果你只通过PyObject * args, PyObject_CallMethodObjArgs()是一个 更快的选择。

而且

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

返回值:新基准。

调用对象o的方法,其中该方法的名称被赋予 作为名称中的Python字符串对象。它用 PyObject*参数调用 。自变量为 ,其参数为 参数后面跟着NULL。返回 成功的呼叫结果,或 NULL失败。

+0

知道什么 “对象协议” 是是问题。另外,由于某种原因,我正在寻找引用。谢谢。 – jmucchiello 2009-09-01 20:01:30

3

你的例子是:

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

我知道它已经晚了7年,但是在格式arg中意味着什么? – JMzance 2016-09-29 15:57:37

+0

它与Py_BuildValue使用的格式字符串相同:parens表示它将构建一个元组,s表示下一个参数(“An arg”)将是一个C char *字符串,转换为Python字符串。元组被用作函数的位置参数,所以我们传递一个字符串。 – 2016-09-29 23:29:13

+0

如果我想传递一个c数组作为字符串列表或双精度列表,比如'['kks','sss','www','sse']'或'[323.9,32,443, 434.8,56.6]'? – jaykumarark 2017-10-03 23:37:09

相关问题