PyO3 将 Rust 结构转换为 PyObject

PyO3 convert rust struct to PyObject

我有一个简单的 class 注释 #[pyclass]

#[pyclass]
pub struct A {
    ...
}

现在我有了一个函数

fn f(slf: Py<Self>) -> PyObject{
   //... some code here
   let output = A{...};
   output.to_object()   // Error: method `to_object` not found for this
}

我是否应该用某些东西来注释我的结构以使其派生 pyo3::ToPyObject

如果你对函数签名有控制权,你可以把它改成fn f(slf: Py<Self>) -> A

只要可能,我更喜欢这种方法,因为这样转换就在幕后发生。

如果您需要保持签名通用,因为您可能会返回不同类型的结构,则需要调用正确的转换方法。

标记为 #[pyclass] 的结构将实现 IntoPy<PyObject>,但转换方法不是调用 to_object 而是调用 into_py,它需要一个 gil 令牌.所以这就是你要做的:

fn f(slf: Py<Self>) -> PyObject {
  //... some code here
  let gil = Python::acquire_gil()?;
  let py = gil.python();
  output.into_py(py)
}