- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我一直在用 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 */
};
问题是将类型为 PyCFunctionWithKeywords
的 kwarg_parrot
转换为 PyCFunction
的行。
来自 C++ 背景(考虑到我正在包装 C++ 代码),使用 C 风格的转换似乎是错误的。我试过 static_cast
和 dynamic_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/
我正在尝试为 python3 编写一个 C 扩展模块,例如 foo,并且我正在尝试定义可以采用关键字参数的方法。 static PyObject* fooImpl(PyObject*, PyObjec
最近我一直在用 python 包装大量 C++ 代码,我发现这个 block (直接取自 python documentation)有点麻烦: static PyMethodDef keywdarg_
我是一名优秀的程序员,十分优秀!