首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将布尔值传递给Python C扩展的“正确”方法是什么?

将布尔值传递给Python C扩展的“正确”方法是什么?
EN

Stack Overflow用户
提问于 2012-02-16 17:37:59
回答 3查看 12.6K关注 0票数 26

这是python文档(http://docs.python.org/extending/extending.html)中的一个简单示例:

代码语言:javascript
运行
复制
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选项。所以我想到了以下几点:

  1. 读取整数并只使用值(因为bool是int的子类)
  2. 调用整数上的PyBool_FromLong()
  3. 读取和对象并调用PyBool_Check()来验证它是bool
  4. 也许有一种方法可以得到任何类型的变量并得到它的真值(即空数组将是假的等等)。这就是python函数通常所做的事情。

有这些更好的吗?其他选择?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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代码。

票数 23
EN

Stack Overflow用户

发布于 2012-05-22 11:01:48

目前,解析整数(作为"i")是公认的bool方式。

从Python3.3,PyArg_ParseTuple将接受"p" (对于“谓词”),每个最新消息

  • 第14705期:PyArg_Parse()函数族现在支持'p‘格式单元,它接受一个“布尔谓词”参数。它将任何Python值转换为整数--如果为"false“则为-0,否则为1。

注意,在使用PyArg_ParseTuple"p"时,参数必须是(指向) int的指针,而不是C99 bool类型:

代码语言:javascript
运行
复制
int x;    // not "bool x"
PyArg_ParseTuple(args, "p", &x);
票数 19
EN

Stack Overflow用户

发布于 2013-09-16 11:45:41

我发现了另一种方法:

代码语言:javascript
运行
复制
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”。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9316179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档