Boost python 将命名参数传递给成员 class
Boost python passing named parameter to member class
我有以下结构:
struct StuffMaker {
static std::string makeStuff(po::dict options = {})
{
//makes some stuff
}
};
我想在我的 python 模块中公开它来做一些事情:
BOOST_PYTHON_MODULE(stuffMakers)
{
po::class_<StuffMaker>("StuffMaker")
.def("create", &StuffMaker::makeStuff, (arg("options")));
}
但是当我编译解释器并传递以下代码时:
import stuffMakers
maker = stuffMakers.StuffMaker()
maker.makeStuff(options = {})
我得到第一个参数的类型错误,预期的是选项的字典,但是我的 cpp 得到的是“self”引用 - 所以 StuffMaker class 作为第一个参数。基本上这是我的问题,我如何忽略 c++ 绑定中的第一个参数,或者我在定义中的“arg”前面放什么来正确处理“self”参数?
错误如下:
Traceback (most recent call last):
File "<string>", line 6, in <module>
Boost.Python.ArgumentError: Python argument types in
StuffMaker.makeStuff(StuffMaker)
did not match C++ signature:
create(boost::python::dict options)
为了传递 self 参数,您至少有 2 个有效的签名选择:
struct StuffMaker {
static std::string makeStuff(StuffMaker self, po::dict options = {})
{
//makes some stuff
}
//alternatively
static std::string makeStuff(StuffMaker* self, po::dict options = {})
{
//makes some stuff
}
};
此签名工作正常,注册会自动处理隐式参数,因此要注册命名参数,您只需进行以下更改:
BOOST_PYTHON_MODULE(geometry_creators)
{
po::class_<StuffMaker>("StuffMaker")
.def("makeStuff", &StuffMaker::makeStuff, (po::arg("options")), "do some stuff with named parameter");
}
参数列表中的第一个参数是自动添加的,因此无需在 def 注册中隐式添加它。
我有以下结构:
struct StuffMaker {
static std::string makeStuff(po::dict options = {})
{
//makes some stuff
}
};
我想在我的 python 模块中公开它来做一些事情:
BOOST_PYTHON_MODULE(stuffMakers)
{
po::class_<StuffMaker>("StuffMaker")
.def("create", &StuffMaker::makeStuff, (arg("options")));
}
但是当我编译解释器并传递以下代码时:
import stuffMakers
maker = stuffMakers.StuffMaker()
maker.makeStuff(options = {})
我得到第一个参数的类型错误,预期的是选项的字典,但是我的 cpp 得到的是“self”引用 - 所以 StuffMaker class 作为第一个参数。基本上这是我的问题,我如何忽略 c++ 绑定中的第一个参数,或者我在定义中的“arg”前面放什么来正确处理“self”参数?
错误如下:
Traceback (most recent call last):
File "<string>", line 6, in <module>
Boost.Python.ArgumentError: Python argument types in
StuffMaker.makeStuff(StuffMaker)
did not match C++ signature:
create(boost::python::dict options)
为了传递 self 参数,您至少有 2 个有效的签名选择:
struct StuffMaker {
static std::string makeStuff(StuffMaker self, po::dict options = {})
{
//makes some stuff
}
//alternatively
static std::string makeStuff(StuffMaker* self, po::dict options = {})
{
//makes some stuff
}
};
此签名工作正常,注册会自动处理隐式参数,因此要注册命名参数,您只需进行以下更改:
BOOST_PYTHON_MODULE(geometry_creators)
{
po::class_<StuffMaker>("StuffMaker")
.def("makeStuff", &StuffMaker::makeStuff, (po::arg("options")), "do some stuff with named parameter");
}
参数列表中的第一个参数是自动添加的,因此无需在 def 注册中隐式添加它。