我正在使用最新版本的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 }
}
}但是,当在下面的示例中在Python中使用这些类时,断言会在克隆Store之后失败。
import pyo3test as po3
mystore = po3.Store(7)
myobj = po3.MyClass(mystore)
assert(myobj.store is mystore)如何修改锈蚀代码,使其维护对Store实例的引用?我认为它可能需要使用PyCell,但我不确定。
谢谢!
发布于 2021-05-26 22:12:08
如果您希望在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 }
}
}通过这些更改,您的断言将传递给我,并且两个Store的地址相同:
>>> mystore = po3.Store(7)
>>> myobj = po3.MyClass(mystore)
>>> assert(myobj.store is mystore)
>>> mystore
<Store at 0x7f3a726bc590>
>>> myobj.store
<Store at 0x7f3a726bc590>https://stackoverflow.com/questions/67711215
复制相似问题