使用引用参数提升python方法调用

Ram*_*gil 6 c++ python boost boost-python

我试图通过从python引用到C++类方法来进行简单的调用.

我的C++代码如下所示:

class Foo {
protected:
  int _internalVal;
public:
  Foo() : _internalVal(5){}
  void getVal(int& val_io) {val_io = _internalVal;}
  void getValDoesNothing(int val_io) {val_io = _internalVal;}
}
Run Code Online (Sandbox Code Playgroud)

我编译好的boost包装器代码是:

BOOST_PYTHON_MODULE(libBar) {
  boost::python::class_<Foo>("Foo")
    .def("getVal", &Foo::getVal)
    .def("getValDoesNothing", &Foo::getValDoesNothing);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我进行以下python调用时:

In [1]: import libBar

In [2]: f = libBar.Foo()

In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0>

In [4]: val = int()

In [5]: #next command is just to check function signature type

In [6]: f.getValDoesNothing(val)

In [7]: f.getVal(val)
---------------------------------------------------------------------------
ArgumentError                             Traceback (most recent call last)
<ipython-input-5-531e4cea97c2> in <module>()
----> 1 f.getVal(val)

ArgumentError: Python argument types in
    Foo.getVal(Foo, int)
did not match C++ signature:
    getVal(Foo {lvalue}, int {lvalue})
Run Code Online (Sandbox Code Playgroud)

我正在使用我无法控制的库,因此更改getVal以返回值不是一个选项.

有没有办法让最后一个Python命令工作?

我甚至会采取一个不会改变Python变量但仍然允许函数调用的修复程序.

Hug*_*rrá 6

你想要实现的是在Python中无效.整数是不可变的,所以你不能简单地调用一个函数,并希望它会改变它的内容.

由于您正在使用库而不是控制和更改getVal以返回值不是一个选项,您可以创建一个这样的包装器:

int getVal(Foo &foo) {
    int val_io;
    foo.getVal(val_io);
    return val_io;
};

BOOST_PYTHON_MODULE(libBar) {
    boost::python::def("getVal", getVal);
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后以这种方式使用:

In [1]: import libBar

In [2]: f = libBar.Foo()

In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0

In [3]: libBar.getVal(f)
Out[3]: 5
Run Code Online (Sandbox Code Playgroud)