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

标签 c++ python

最近我一直在用 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/

相关文章:

c++ - 高效的目标矩形源矩形裁剪

python - 每次打开/关闭文件与保持打开直到过程完成更好吗?

python - 如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]

python - 从 python 3 中的 csv 文件创建字典

c++ - 表达式必须是我类(class)中的可修改左值

c# - 找不到 DLL : referencing dependent DLLs

c++ - 动态迭代静态信息

python - 连接到我自己笔记本电脑上树莓派上运行的 MySQL

python - 我如何有效地将 2d python 列表提供给 C++ 扩展模块

c++ - 如何访问模板类型参数包中的类型索引?