这是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选项。所以我想到了以下几点:
有这些更好的吗?其他选择?
发布于 2012-02-16 17:52:53
4.也许有一种方法可以得到任何类型的变量并得到它的真值(即空数组将是假的等等)。这就是python函数通常所做的事情。
是:(来自Python/C API引用)
int PyObject_IsTrue(PyObject *o) 如果对象o被认为是真,则返回1,否则返回0。这相当于Python表达式,而不是o。如果失败,返回-1。
编辑。为了回答实际问题,我认为方法1是正确的,因为int实际上是C中的对应类型。在Python中,没有原因的显式类型检查(在3中)是不受欢迎的。转换到另一个Python对象(如2)无助于C代码。
发布于 2012-05-22 11:01:48
目前,解析整数(作为"i"
)是公认的bool方式。
从Python3.3,PyArg_ParseTuple
将接受"p"
(对于“谓词”),每个最新消息
注意,在使用PyArg_ParseTuple
和"p"
时,参数必须是(指向) int
的指针,而不是C99 bool
类型:
int x; // not "bool x"
PyArg_ParseTuple(args, "p", &x);
发布于 2013-09-16 11:45:41
我发现了另一种方法:
PyObject* py_expectArgs;
bool expectArgs;
PyArg_ParseTupleAndKeywords(args, keywds, (char *)"O!", (char **)kwlist, &PyBool_Type, &py_expectArgs);
expectArgs = PyObject_IsTrue(py_expectArgs);
如果有错误的param调用,则有“自动”异常“参数1必须是bool,而不是int”。
https://stackoverflow.com/questions/9316179
复制相似问题