首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Boost.Python公开带有无符号字符和参数的方法

使用Boost.Python公开带有无符号字符和参数的方法
EN

Stack Overflow用户
提问于 2012-10-16 22:24:03
回答 1查看 1.1K关注 0票数 1

我有一个封闭源码的C++库,它提供的头文件的代码等同于:

代码语言:javascript
运行
复制
class CSomething
{
  public:
      void getParams( unsigned char & u8OutParamOne, 
                      unsigned char & u8OutParamTwo ) const;
  private:
      unsigned char u8OutParamOne_,
      unsigned char u8OutParamTwo_,
};

我试着把它暴露给Python,我的包装器代码是这样的:

代码语言:javascript
运行
复制
BOOST_PYTHON_MODULE(MySomething)
{
    class_<CSomething>("CSomething", init<>())
        .def("getParams", &CSomething::getParams,(args("one", "two")))

}

现在我尝试在Python中使用它,它失败得很可怕:

代码语言:javascript
运行
复制
one, two = 0, 0
CSomething.getParams(one, two)

这会导致:

代码语言:javascript
运行
复制
ArgumentError: Python argument types in
    CSomething.getParams(CSomething, int, int)
did not match C++ signature:
    getParams(CSomething {lvalue}, unsigned char {lvalue} one, unsigned char {lvalue} two)

我需要在Boost.Python包装器代码或Python代码中进行哪些更改才能使其正常工作?我如何添加一些Boost.Python魔术来自动将PyInt转换为unsigned char,反之亦然?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 00:22:42

Boost.Python抱怨缺少一个lvalue参数,这个概念在Python中是不存在的:

代码语言:javascript
运行
复制
def f(x):
  x = 1

y = 2
f(y)
print(y) # Prints 2

f函数的x参数不是类似C++的引用。在C++中,输出是不同的:

代码语言:javascript
运行
复制
void f(int &x) {
  x = 1;
}

void main() {
  int y = 2;
  f(y);
  cout << y << endl; // Prints 1.
}

这里有几个选择:

a)包装CSomething.getParams函数以返回新参数值的元组:

代码语言:javascript
运行
复制
one, two = 0, 0
one, two = CSomething.getParams(one, two)
print(one, two)

b)包装CSomething.getParams函数以接受一个类实例作为参数:

代码语言:javascript
运行
复制
class GPParameter:
  def __init__(self, one, two):
    self.one = one
    self.two = two

p = GPParameter(0, 0)
CSomething.getParams(p)
print(p.one, p.two)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12916877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档