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

2024-01-14

这是 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);
}

如果我想向函数传递一个额外的布尔参数 - “正确”的方法是什么?

似乎没有 bool 选项可以传递给 PyArg_ParseTuple()。所以我想到了以下几点:

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

其中有哪一个更可取?其他选择?


4也许有一种方法可以获取任何类型的变量并获取其真值(即空数组将是假值等),这就是python 函数通常会这样做。

是的:(来自Python/C API 参考 http://docs.python.org/c-api/object.html)

int PyObject_IsTrue(PyObject *o)

如果对象 o 被认为是 true,则返回 1,否则返回 0。 这相当于 Python 表达式 not not o。失败时, 返回-1。

编辑。为了回答实际问题,我认为方法 1 是正确的,因为 int 确实是 C 中的相应类型。方法 4 很好,但是如果您将函数记录为采用 bool,则没有义务只接受任何对象。像 3 中那样无缘无故的显式类型检查在 Python 中是不受欢迎的。如 2 中所示转换为另一个 Python 对象对您的 C 代码没有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐