[英]How to implement trait FromPyObject for my rust struct
考慮一個通過 pyo3 暴露給 python 的簡單 rust 類
use pyo3::prelude::*;
#[pyclass(name=MyClass)]
pub struct PyMyClass {
// Some fields
}
#[pymethods]
impl PyMyStruct {
#[new]
fn py_new(obj: PyRawObject) {
obj.init({
PyMyStruct {
// ...
}
});
}
}
現在有一個函數應該以這種方式使用 python 中的兩個結構調用:
a = MyStruct()
b = MyStruct()
c = foo(a,b)
因此一個定義
#[pyfunction]
fn foo(a: PyMyStruct, b: PyMyStruct) -> PyResult<PyMyStruct> {
// some high performance logic implemented in rust ...
}
現在編譯器聲稱PyMyStruct
應該實現 trait FromPyObject
:
impl FromPyObject<'_> for PyMyStruct {
fn extract(ob: &'_ PyAny) ->PyResult<Self> {
// I dont know what to do here :(
}
}
但我不知道如何從PyAny
檢索PyMyStruct
的實例、指針或任何東西......有人可以幫助我嗎?
我對這個板條箱了解不多,但我認為你應該參考你的對象。 請注意,它們與 Python 解釋器的其余部分共享,因此您實際上無法擁有它們。
也就是說,只需寫:
#[pyfunction]
fn foo(a: &PyMyStruct, b: &PyMyStruct) -> PyResult<PyMyStruct> {
// some high performance logic implemented in rust ...
}
或者,如果您想要可變對象:
#[pyfunction]
fn foo(a: &mut PyMyStruct, b: &mut PyMyStruct) -> PyResult<PyMyStruct> {
// some high performance logic implemented in rust ...
}
這是有效的,因為有這些 impls :
impl<'a, T> FromPyObject<'a> for &'a T where
T: PyTryFrom<'a>
impl<'a, T> FromPyObject<'a> for &'a mut T where
T: PyTryFrom<'a>,
然后是另一個:
impl<'v, T> PyTryFrom<'v> for T where
T: PyTypeInfo
如果您使用&mut
變體並將同一個對象傳遞給該函數兩次,會發生什么情況? 好吧,我不確定但略讀代碼我猜你得到了兩個&mut
對同一個對象的引用,因此未定義的行為。 如果我是你,我會使用非mut
變體,如果你真的想改變對象,我會使用RefCell
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.