1

我有一个简单的类注释#[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吗?

4

1 回答 1

3

如果您对函数签名拥有权力,则可以将其更改为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)
}
于 2021-06-23T15:38:04.303 回答