无法了解Boost python函数导出中的语法

时间:2019-04-05 06:43:52

标签: python c++ boost

我现在正在从CARLA模拟器(http://carla.org/)看一些代码。
它使用boost python向python公开了许多C ++类和成员函数。但是我无法从下面的几行中了解语法。

void export_blueprint() {
  using namespace boost::python;
  namespace cc = carla::client;
  namespace crpc = carla::rpc;
...
  class_<cc::ActorBlueprint>("ActorBlueprint", no_init)
    .add_property("id", +[](const cc::ActorBlueprint &self) -> std::string {
      return self.GetId();
    })
    .add_property("tags", &cc::ActorBlueprint::GetTags)
    .def("contains_tag", &cc::ActorBlueprint::ContainsTag)
    .def("match_tags", &cc::ActorBlueprint::MatchTags)
    .def("contains_attribute", &cc::ActorBlueprint::ContainsAttribute)
    .def("get_attribute", +[](const cc::ActorBlueprint &self, const std::string &id) -> cc::ActorAttribute {  
      return self.GetAttribute(id);
    })  // <=== THESE LINES
    .def("set_attribute", &cc::ActorBlueprint::SetAttribute)
    .def("__len__", &cc::ActorBlueprint::size)
    .def("__iter__", range(&cc::ActorBlueprint::begin, &cc::ActorBlueprint::end))
    .def(self_ns::str(self_ns::self))
  ;
}

下面的代码是什么

.def("get_attribute", +[](const cc::ActorBlueprint &self, 
     const std::string &id) -> cc::ActorAttribute { 
      return self.GetAttribute(id);
    })  

是什么意思?看起来像是python类ActorBlueprint的函数get_attribute函数正在使用从python接口传递的新参数重新定义(覆盖)。我几乎可以确定,但是是否有关于此语法的文档?我在https://www.boost.org/doc/libs/1_63_0/libs/python/doc/html/tutorial/index.html中找不到一个。

1 个答案:

答案 0 :(得分:0)

我将逐个元素进行解释。

.def("get_attribute", ...) //method call with arguments

+[](const cc::ActorBlueprint &self, const std::string &id) -> cc::ActorAttribute {...}
// C++ lambda, passed to above method as second argument

return self.GetAttribute(id); // this is the lambda body

您可以阅读有关lambda语法here的信息。 另外,lambda前面的+对您来说可能看起来很奇怪。它用于触发向普通旧函数指针的转换。阅读here

lambda -> cc::ActorAttribute中的箭头指定返回类型。它也可以用于普通功能和方法。

这是本机c ++语法,不是特定于boost的。

作为此代码的结果,将定义python类ActorBlueprint的方法get_attribute。它将具有一个字符串参数,并将执行lambda主体所做的事情(在这种情况下,通过id返回属性)。