【发布时间】:2021-10-21 16:05:49
【问题描述】:
假设我有一个像这样的 Rust 结构
struct X{...}
struct Y{
x:X
}
我希望能够编写通过Y访问X的python代码
y = Y()
y.x.some_method()
在 PyO3 中实现它的最佳方式是什么?目前我做了两个包装类
#[pyclass]
struct XWrapper{
x:X
}
#[pyclass]
struct YWrapper{
y:Y
}
#[pymethods]
impl YWrapper{
#[getter]
pub fn x(&self)->XWrapper{
XWrapper{x:self.y.clone()}
}
}
但是,这需要clone()。我宁愿返回参考。当然我知道如果X 是pyclass,那么我可以轻松地将PyRef 返回给它。但问题是 X 和 Y 来自 Rust 库,我不能傻傻地将 #[pyclass] 添加到它们。
【问题讨论】:
-
但是如果你想从 Python 调用
x上的方法,它必须是pyclass,不是吗? -
没关系,当然这就是您使用包装器的原因。所以现在的问题是,如果可能的话,如何避免克隆。