这是python文档(http://docs.python.org/extending/extending.html)中的一个简单示例:
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return Py_BuildValue("i", sts);
}
如果我想将另一个布尔参数传递给函数 - 那么“正确”的方法是什么?
似乎没有传递给PyArg_ParseTuple()的bool选项。所以我想到了以下几点:
这些更好吗?其他选择?
答案 0 :(得分:21)
4也许有办法获得任何类型的变量并得到它的真值(即一个空数组将是假的等等)这是什么python 功能通常都是。
是:(来自Python/C API Reference)
int PyObject_IsTrue(PyObject *o)
如果对象o被认为是真,则返回1,否则返回0。 这相当于Python表达式而不是o。失败的时候 返回-1。
EDIT。为了回答实际问题,我认为方法1是正确的,因为int实际上是C中的相应类型。方法4很好,但如果你将你的函数记录为bool,你没有义务接受任何对象。在Python中,没有理由的显式类型检查在3中是不受欢迎的。像在2中一样转换到另一个Python对象对您的C代码没有帮助。
答案 1 :(得分:15)
目前,解析一个整数("i"
)是接受bool的可接受方式。
从Python 3.3开始,PyArg_ParseTuple
将接受"p"
(对于“谓词”),每the latest NEWS:
- Issue #14705:PyArg_Parse()系列函数现在支持'p'格式 unit,接受“布尔谓词”参数。它转换任何Python 值为整数 - 如果为“false”则为0,否则为1。
请注意,将PyArg_ParseTuple
与"p"
一起使用时,参数必须是(指针)int
,而不是C99 bool
类型:
int x; // not "bool x"
PyArg_ParseTuple(args, kwds, "p", &x);
答案 2 :(得分:6)
我找到了另一种方法:
PyObject* py_expectArgs;
bool expectArgs;
PyArg_ParseTupleAndKeywords(args, keywds, (char *)"O!", (char **)kwlist, &PyBool_Type, &py_expectArgs);
expectArgs = PyObject_IsTrue(py_expectArgs);
如果错误的参数调用有“自动”异常“参数1必须是bool,而不是int”