在PyMethodDef中铸造PyCFunctionWithKeywords

casting PyCFunctionWithKeywords in PyMethodDef

本文关键字:PyCFunctionWithKeywords PyMethodDef      更新时间:2023-10-16

最近我在python中包装了很多C++代码,我发现这个块(直接取自python文档)有点麻烦:

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 */
};

问题是将PyCFunctionWithKeywords类型的kwarg_parrot强制转换为PyCFunction的行。

来自C++背景(并且考虑到我正在包装C++代码),使用C样式转换似乎是错误的。我尝试过static_castdynamic_cast,它们都会引起编译器的抱怨(有充分的理由,从一般意义上讲,这确实是一个不安全的强制转换)。唯一可行的C++选项似乎是reinterpret_cast,但据我所知,这是C样式转换的一个更详细的版本。

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

不幸的是,像Boost.Python和SWIG这样的解决方案是不可能的。(我在一个丑陋的框架内工作)

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

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

如果您希望C++风格与Python集成,请找到一种使用boost.Python的方法。或者是cython。

PyMethodDef是Python C API的一部分,所以我只使用C强制转换。它是有效的,也是所有Python扩展都在使用的。保持一致。

使用不属于Python API的对象时,请使用C++强制转换。

相关文章:
  • 没有找到相关文章