如何使用 解析用户定义的类型(或来自现有非标准库的类型)PyArg_ParseTuple
?
问问题
1517 次
2 回答
5
O
正如 Martijn 建议的那样,我通常更喜欢使用 format ,而不是使用普通O&
格式。它允许您传递一个函数,该函数将被调用以将 any 转换PyObject*
为任意 C(双)指针。这是一些示例用法,其中我将传递的值转换为指向我自己的对象类型的指针:
/**
* This method should return 0 if it does not work or 1 in case it does
* PyArg_*() functions will handle the rest from there or let your program
* continue in case things are fine.
*/
int MyConverter(PyObject* o, MyOwnType** mine) {
//write the converter here.
}
然后,此时您需要解析对象:
/**
* Simple example
*/
static PyObject* py_do_something(PyObject*, PyObject* args, PyObject* kwds) {
/* Parses input arguments in a single shot */
static char* kwlist[] = {"o", 0};
MyOwnType* obj = 0; ///< if things go OK, obj will be there after the next call
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &MyConverter, &obj))
return 0; ///< we have failed, let Python check exceptions.
/* if you get to this point, your converter worked, just use */
/* your newly allocated object and free it, when done. */
}
这种方法的优点是您可以将您MyConverter
的 C-API 封装起来,然后在其他函数中重复使用它来完成相同的工作。
于 2013-10-24T20:11:21.773 回答
3
可以使用以下O
格式解析自定义 python 类:
O
(object) [PyObject *]
将 Python 对象(无需任何转换)存储在 C 对象指针中。C 程序因此接收传递的实际对象。对象的引用计数不会增加。存储的指针不为 NULL。
于 2013-10-09T20:58:45.443 回答