gpt4 book ai didi

python - 复制一个 boost.python 对象

转载 作者:太空狗 更新时间:2023-10-30 02:23:18 24 4
gpt4 key购买 nike

我有一些 boost python 类,我在 python 中实例化了它们。我想复制它们。所以,如果我有

p = Bernoulli(0.5)

我想做

q = Bernoulli(p)

但是如果我不知道 p 的类型怎么办?我试着这样做:

q = copy.deepcopy(p)

但是 python 说它不能 pickle p。

我唯一的解决方案是向伯努利接口(interface)添加一个 clone() 函数吗?或者我可以以某种方式自动生成该方法吗?可以使 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 & >())

关于python - 复制一个 boost.python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com