gpt4 book ai didi

c++ - 在 PyMethodDef 中类型转换 PyCFunctionWithKeywords

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:10 24 4
gpt4 key购买 nike

最近我一直在用 python 包装大量 C++ 代码,我发现这个 block (直接取自 python documentation)有点麻烦:

static PyMethodDef keywdarg_methods[] = {
/* The cast of the function is necessary since PyCFunction values
* only take two PyObject* parameters, and keywdarg_parrot() takes
* three.
*/
{"parrot", (PyCFunction)keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,
"Print a lovely skit to standard output."},
{NULL, NULL, 0, NULL} /* sentinel */
};

问题是将类型为 PyCFunctionWithKeywordskwarg_parrot 转换为 PyCFunction 的行。

来自 C++ 背景(考虑到我正在包装 C++ 代码),使用 C 风格的转换似乎是错误的。我试过 static_castdynamic_cast,这两种方法都会导致编译器报错(有充分的理由,这确实是一般意义上的不安全转换)。唯一可行的 C++ 选项似乎是reinterpret_cast,但据我所知,这是一个更冗长的 C 风格转换版本。

当然,上面的包裹在extern "C" block 中,所以也许C 方式是正确的方式。有没有人有更好的主意? (我真正希望看到的是一种可以根据关键字自动生成文档字符串的解决方案。)

不幸的是,Boost.Python 和 SWIG 等解决方案不在考虑之列。 (我在一个丑陋的框架内工作)

最佳答案

主要的 Python 实现是用 C 而不是 C++ 编写的。

因此,评估 keywdarg_methods[] 的 libpython 代码是用 C 语言编写的,并通过 C 调用约定调用 keywdarg_parrot

如果你想将 C++ 风格与 Python 集成,找到一种方法来代替使用 boost.python。或者可能是 cython。

关于c++ - 在 PyMethodDef 中类型转换 PyCFunctionWithKeywords,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9496753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com