复制 boost.python 对象
我有一些 boost python 类,我在 python 中实例化它们。我想复制它们。所以,如果我有
p = Bernoulli(0.5)
我想做的
q = Bernoulli(p)
但是如果我不知道 p 的类型怎么办?我尝试这样做:
q = copy.deepcopy(p)
但 python 说它无法 pickle p。
我唯一的解决方案是将clone()函数添加到伯努利接口吗?或者我可以以某种方式自动生成该方法吗? copy.deepcopy 可以与 Boost.python 对象一起使用吗?
I have some boost python classes, which I instantiate in python. I want to copy them. So, if I have
p = Bernoulli(0.5)
I want to do
q = Bernoulli(p)
But what if I don't know p's type? I tried to do this:
q = copy.deepcopy(p)
but python said it couldn't pickle p.
Is my only solution to add a clone() function to the interface of Bernoulli? Or can I have that method automatically generated somehow? Can copy.deepcopy be made to work with Boost.python objects?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
来自 http://mail.python.org/pipermail/cplusplus- sig/2009-May/014505.html
使用它:
From http://mail.python.org/pipermail/cplusplus-sig/2009-May/014505.html
To use it:
对于复制,您可以实现 __copy__ 和 __deepcopy__ 特殊方法(其中之一可以仅包装复制构造函数,具体取决于类的 C++ 复制语义),或者添加pickling 支持。
copy
模块将使用特殊的复制方法(如果可用),否则将使用 pickling 方法。下面是使用复制构造函数实现 __copy__ 的示例:
For copying, you can either implement the
__copy__
and__deepcopy__
special methods (one of them could just wrap the copy constructor, depending on the C++ copy semantics of the class), or add pickling support. Thecopy
module will use the special copying methods if they are available and the pickling methods otherwise.Here is an example for using the copy constructor to implement
__copy__
:是的,您可以通过在对象上实现 __setstate__ 和 __getstate__ 方法来使 boost::python 对象可深度复制(也可选取)。
基本上, __getstate__ 应该返回一个表示对象内部状态的(python)对象,而 __setstate__ 显然接受所述对象并更新对象的状态。
如果您的对象采用
__init__
参数,您还应该考虑实现__getinitargs__
。有关更多信息,请参阅 Python 文档。
Yes, you can make boost::python objects deep-copyable (and also pickable) by implementing the
__setstate__
and__getstate__
methods on your object.Basically,
__getstate__
should return an (python) object that represents the internal state of your object, while__setstate__
obviously accepts said object and updates the state of your object.If your object takes arguments for
__init__
, you should also look at implementing__getinitargs__
.See the Python docs for more information.