簡體   English   中英

如何為我的 rust 結構實現 trait FromPyObject

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM