8

给定一个指向 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")
4

2 回答 2

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

阅读Python C API 文档。在这种情况下,您需要对象协议

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)

返回值:新引用。

调用 object 的方法o,其中方法的名称以 Python 字符串对象的形式给出。它使用可变数量的 PyObject*参数调用。参数作为可变数量的参数提供,后跟NULL. 返回调用成功或 NULL失败的结果。

于 2009-09-01T19:14:33.797 回答
3

你的例子是:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
于 2009-09-01T19:27:05.363 回答