文档提到只有在boost::python::def()
提供非空函数或成员函数指针时才能提供文档字符串。一种解决方案是将函数对象调用包装在一个函数中:
#include <boost/function.hpp>
#include <boost/python.hpp>
int times_two(int x) { return x * 2; }
boost::function<int(int)> func = ×_two;
int times_two_wrap(int x) { return func(x); }
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::def("times_two", ×_two_wrap,
"returns two times the supplied value");
}
交互使用:
>>> import example
>>> assert(6 == example.times_two(3))
>>> print help(example.times_two)
times_two( (int)arg1) -> int :
returns two times the supplied value
C++ signature :
int times_two(int)
>>>
Boost.Python 有多个 API 层。最高层大多有文档记录,但它使用了文档较少的低级 API。在这种特殊情况下,高级 API 似乎无法很好地转发到低级 API。可以改为使用 创建一个 python 函数boost::python::make_function()
,然后使用较低级别的boost::python::objects::add_to_namespace()
函数,如下所示:
#include <boost/function.hpp>
#include <boost/python.hpp>
int times_two(int x) { return x * 2; }
boost::function<int(int)> func = ×_two;
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
// Wrap the functor in a Python object.
python::object py_func = python::make_function(
func,
python::default_call_policies(),
boost::mpl::vector<int, int>());
// Add the function directly to the namespace.
python::objects::add_to_namespace(
python::scope(), // current namespace,
"times_two", // function name,
py_func, // function,
"returns two times the supplied value");
}
这会产生与交互式使用相同的输出。两种方法之间唯一显着的行为差异是,第一个示例允许通过将新值分配给func
.