如何解决如何在pyo3中编写类?
我使用的是最新版本的 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)
如何修改 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 }
}
}
通过这些更改,我和两个Store
都住在同一个地址:
>>> mystore = po3.Store(7)
>>> myobj = po3.MyClass(mystore)
>>> assert(myobj.store is mystore)
>>> mystore
<Store at 0x7f3a726bc590>
>>> myobj.store
<Store at 0x7f3a726bc590>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。