复制boost.python对象
我有一些boostpython类,我用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对象一起工作吗?是的,您可以通过在对象上实现
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 & >())