为了账号安全,请及时绑定邮箱和手机立即绑定

SWIG:避免 C++ 到 Python 的别名

SWIG:避免 C++ 到 Python 的别名

犯罪嫌疑人X 2023-04-25 17:47:16
我正在用 C++ 构建一个库,它使用 SWIG 连接到 Python 3 4.0.1。经过一段时间的开发后,我注意到(我认为是所谓的)别名问题。我准备了一个最小的例子,这也会发生。考虑具有在 处初始化的dummy单个(私有)属性的类。现在,我有这个非常小的 python 脚本:attr0import dummy_wrapd1 = dummy_wrap.dummy()d2 = d1d1.set_attr(12)print(d2.get_attr()) # this prints '12', not '0'我希望我所说的别名是这里真正发生的事情:对象d2从未被修改,但它采用给定的值d1,就好像赋值d2=d1实际上是指针赋值一样。我希望发生的事情(也是我期望发生的事情)是赋值运算符制作passes it ontoa=b的硬拷贝。换句话说,修改不应该影响,反之亦然,只要这符合实现细节(就像我的库和最小示例中的情况一样)。baab最后一点,这是我在编译时收到的消息:g++ -fPIC -c dummy.cppg++ -fPIC -shared -o libdummy_lib.so dummy.oswig -Wall -c++ -python -py3 -o dummy_wrap.cxx dummy_wrap.idummy.hpp:10: Warning 362: operator= ignoreddummy.hpp:11: Warning 362: operator= ignoreddummy.hpp:7: Warning 509: Overloaded method dummy::dummy(dummy &&) effectively ignored,dummy.hpp:6: Warning 509: as it is shadowed by dummy::dummy(dummy const &).g++ -fPIC -c dummy_wrap.cxx -I /usr/include/python3.8g++ -fPIC -shared -o _dummy_wrap.so dummy_wrap.o -L . -ldummy_lib -lpython3.8问题:我想了解这里发生了什么以及为什么:和dummy(dummy&&)影响dummy& operator=(dummy&&)SWIG 包装dummy(const dummy&)和的方式dummy& operator=(const dummy&)吗?期望我想要的默认行为是否合理,即这是(别名)使用 SWIG 连接到 python 后类的预期行为吗?我该如何解决这个问题:我应该做哪些更改才能让操作员=制作硬拷贝?
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

因此,感谢原帖中的一些评论,一个可能的解决方案是添加一个clone()方法。可以通过简单地扩展 C++ 标头来做到这一点。但是,由于这对某些人来说可能看起来很奇怪,因为在许多情况下clone()根本不需要 C++ 中的方法,因此我们可以使用 SWIG 扩展 python 类。只需以dummy_wrap.i示例中的 并在文件末尾添加以下代码


%extend dummy {

    dummy clone() const {

        return *$self;

    }

}

不幸的是,这还没有结束,因为我们的 python 代码必须修改:


import dummy_wrap

d1 = dummy_wrap.dummy()

d2 = d1.clone()

d1.set_attr(12)

print(d2.get_attr()) # now this prints '0'


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信