复制boost.python对象

复制boost.python对象,python,boost-python,Python,Boost Python,我有一些boostpython类,我用python实例化它们。我想复制它们。所以,如果我有 p = Bernoulli(0.5) 我想做什么 q = Bernoulli(p) 但是如果我不知道p的类型呢?我试着这样做: q = copy.deepcopy(p) 但是python说它不能腌制p 我唯一的解决方案是向Bernoulli的接口添加clone()函数吗?或者我可以自动生成该方法吗?可以使copy.deepcopy与Boost.python对象一起工作吗?是的,您可以通过在对象上实现

我有一些boostpython类,我用python实例化它们。我想复制它们。所以,如果我有

p = Bernoulli(0.5)
我想做什么

q = Bernoulli(p)
但是如果我不知道p的类型呢?我试着这样做:

q = copy.deepcopy(p)
但是python说它不能腌制p


我唯一的解决方案是向Bernoulli的接口添加clone()函数吗?或者我可以自动生成该方法吗?可以使copy.deepcopy与Boost.python对象一起工作吗?

是的,您可以通过在对象上实现
\uuuuuuu setstate\uuuuu
\uu getstate\uuuuuu
方法,使Boost::python对象可以进行深度复制(也可以拾取)

基本上,
\uuuuu getstate\uuuuu
应该返回一个表示对象内部状态的(python)对象,而
\uuuu setstate\uuuuuu
显然接受所述对象并更新对象的状态

如果对象接受
\uuuuu init\uuuu
的参数,那么还应该考虑实现
\uuuu getinitargs\uuuu


参见Python,获取更多信息。

< P>用于复制,您可以实现< C++ >代码> >代码> >代码>深度代码> /CODE>特殊方法(其中一种方法可以根据类的C++复制语义包装复制构造函数),或者添加。
复制
模块将使用特殊复制方法(如果可用),否则将使用酸洗方法

下面是一个使用复制构造函数实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

template<typename T> const T copyObject(const T& v) { return v; }
boost::python::class_<C>("C").def("__copy__", copyObject<C>);
template const T copyObject(const T&v){return v;}
boost::python::class_uu(“C”).def(“uu copy_uuu”,copyObject);
来自

定义PYTHON错误(类型、原因)\ { \ PyErr_SetString(类型、原因)\ 抛出bp::错误_已_集()\ } 模板 内联PyObject*管理PyObject(T*p) { 返回typename bp::manage_new_object::apply::type()(p); } 模板 对象 通用复制(bp::对象可复制) { 可复制*新可复制(新可复制(bp::extract(可复制)); 对象 结果(bp::detail::new_引用(managengpyobject(newCopyable)); bp::extract(result.attr(“\uu dict”)()。update( 可复制的.attr(“uu dict”); 返回结果; } 模板 对象 通用\uuuuuuuuuuuuuuuuuuuu深度复制(bp::对象可复制,bp::dict memo) { bp::object copyMod=bp::导入(“复制”); 对象deepcopy=copyMod.attr(“deepcopy”); 可复制*新可复制(新可复制(bp::extract(可复制)); 对象 结果(bp::detail::new_引用(managengpyobject(newCopyable)); //黑客:可复制id应与id的结果相同(可复制) 用Python- //请告诉我有更好的方法!(哪一种;-p) int copyableId=(int)(copyable.ptr()); 备注[可复制ID]=结果; bp::extract(result.attr(“\uu dict”)()。update( deepcopy(bp::extract(copyable.attr(“\uu dict”)(), 备忘录),; 返回结果; }
要使用它:

class_<foo>(foo)
   .def("__copy__", &generic__copy__< foo >)
   .def("__deepcopy__", &generic__deepcopy__< foo >)
   .def(init< const foo & >())
类(foo)
.def(“\uuuuu copy\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
.def(“\uuuu deepcopy\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
.def(init())

< /COD>如何使用Boosix.Python来实现复制代码构造函数< C++ >代码> >代码>?谢谢,但是我得到了错误:<代码> BooSt.python .AguMulturor:Python参数类型在Dirichlet中。
@Neil:
\uuuu deepcopy\uuuuu
方法有一个不同的签名:它被传递给一本字典以备记忆。你知道,我会自己发布的。现在我只能投你的一票了。grrrr@马修,哈哈哈。也许你能给我解释一下我应该在64位编译器上做什么,因为指针不能强制转换为int?@Matthew,而且,我也不确定为什么这个通用拷贝比Philipp的要好?是因为它复制了您可能添加到对象dict中的任何内容吗?(我最终通过long-long转换为int,因为我注意到python id似乎是32位int。)@Neil G,我不确定您应该如何处理64位的情况。现在,我们的包装库只存在于32位中,所以我们没有这个问题。真正的解决方案是让C/Python API或BP公开一种可移植的方式来获取id(可复制)为int。使BP对象可拾取是目前最糟糕的可复制方式。C++有很好的高效复制工具。酸洗需要通过一根线进行往返,相比之下,它的成本高得惊人。这甚至不是使BP对象可拾取的最佳方法。请参阅:boost::python::pickle\u套件
class_<foo>(foo)
   .def("__copy__", &generic__copy__< foo >)
   .def("__deepcopy__", &generic__deepcopy__< foo >)
   .def(init< const foo & >())