我正在使用最新版本的 pyo3(主分支),目前尚不清楚如何将一个类的实例存储Store在另一个类上,如下例所示。例如,下面的代码组成了两个类,Store并且MyClass在一定程度上会起作用。
use pyo3::prelude::*;
#[pyclass]
#[derive(Clone)]
struct Store {
#[pyo3(get, set)]
data: i32
}
#[pymethods]
impl Store {
#[new]
fn new(data: i32) -> Self {
Store{ data }
}
}
#[pyclass]
struct MyClass {
#[pyo3(get, set)]
store: Store,
}
#[pymethods]
impl MyClass {
#[new]
fn new(store: Store) -> Self {
MyClass{ store }
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当这些类在以下示例中的 Python 中使用时,由于Store被克隆,断言失败。
import pyo3test as po3
mystore = po3.Store(7)
myobj = po3.MyClass(mystore)
assert(myobj.store is mystore)
Run Code Online (Sandbox Code Playgroud)
如何修改 Rust 代码,使其保持对 的同一实例的引用Store?我认为它可能需要使用PyCell,但我不确定。
谢谢!
如果你想有内相同的对象MyClass和Python,你必须包裹store在Py,即:
#[pyclass]
struct MyClass {
#[pyo3(get, set)]
store: Py<Store>,
}
#[pymethods]
impl MyClass {
#[new]
fn new(store: Py<Store>) -> Self {
MyClass { store }
}
}
Run Code Online (Sandbox Code Playgroud)
通过这些更改,您的断言为我传递,并且两者都Store住在同一个地址:
#[pyclass]
struct MyClass {
#[pyo3(get, set)]
store: Py<Store>,
}
#[pymethods]
impl MyClass {
#[new]
fn new(store: Py<Store>) -> Self {
MyClass { store }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |