1

我只是有一个函数对象:

boost::function<int(int)> func = /** ... **/;

并希望使用文档字符串将其公开给 Python。
但很明显:

def("func", func, "Some boring documentation goes here.");

失败并显示有趣的约 2500 行消息。

有任何想法吗?


编辑:我做了其他测试:

def("func", func); // doesn't compile

def("func",
   make_function(
     func,
     default_call_policies(),
     vector<int,int>()
   )
); // compiles

def("func",
   make_function(
     func,
     default_call_policies(),
     vector<int,int>()
   ),
   "Some boring documentation goes here"
); // doesn't compile
4

1 回答 1

2

文档提到只有在boost::python::def()提供非空函数或成员函数指针时才能提供文档字符串。一种解决方案是将函数对象调用包装在一个函数中:

#include <boost/function.hpp>
#include <boost/python.hpp>

int times_two(int x) { return x * 2; }

boost::function<int(int)> func = &times_two;

int times_two_wrap(int x) { return func(x); }

BOOST_PYTHON_MODULE(example)
{
  namespace python = boost::python;
  python::def("times_two", &times_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 = &times_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.

于 2013-03-26T00:48:13.877 回答