首页 / PYTHON / 复制boost.python对象
复制boost.python对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了复制boost.python对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1808字,纯文字阅读大概需要3分钟。
内容图文
我有一些boost python类,我在python中实例化.我想复制它们.所以,如果我有
p = Bernoulli(0.5)
我想要做
q = Bernoulli(p)
但是,如果我不知道p的类型怎么办?我试着这样做:
q = copy.deepcopy(p)
但是python说它无法腌制p.
我唯一的解决方案是将一个clone()函数添加到Bernoulli的接口中吗?或者我可以以某种方式自动生成该方法吗? copy.deepcopy可以与Boost.python对象一起使用吗?
解决方法:
从http://mail.python.org/pipermail/cplusplus-sig/2009-May/014505.html起
#define PYTHON_ERROR(TYPE, REASON) { PyErr_SetString(TYPE, REASON); throw bp::error_already_set(); }
template<class T>
inline PyObject * managingPyObject(T *p)
{
return typename bp::manage_new_object::apply<T *>::type()(p);
}
template<class Copyable>
bp::object
generic__copy__(bp::object copyable)
{
Copyable *newCopyable(new Copyable(bp::extract<const Copyable
&>(copyable)));
bp::object
result(bp::detail::new_reference(managingPyObject(newCopyable)));
bp::extract<bp::dict>(result.attr("__dict__"))().update(
copyable.attr("__dict__"));
return result;
}
template<class Copyable>
bp::object
generic__deepcopy__(bp::object copyable, bp::dict memo)
{
bp::object copyMod = bp::import("copy");
bp::object deepcopy = copyMod.attr("deepcopy");
Copyable *newCopyable(new Copyable(bp::extract<const Copyable
&>(copyable)));
bp::object
result(bp::detail::new_reference(managingPyObject(newCopyable)));
// HACK: copyableId shall be the same as the result of id(copyable)
in Python -
// please tell me that there is a better way! (and which ;-p)
int copyableId = (int)(copyable.ptr());
memo[copyableId] = result;
bp::extract<bp::dict>(result.attr("__dict__"))().update(
deepcopy(bp::extract<bp::dict>(copyable.attr("__dict__"))(),
memo));
return result;
}
要使用它:
class_<foo>(foo)
.def("__copy__", &generic__copy__< foo >)
.def("__deepcopy__", &generic__deepcopy__< foo >)
.def(init< const foo & >())
内容总结
以上是互联网集市为您收集整理的复制boost.python对象全部内容,希望文章能够帮你解决复制boost.python对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。